[RIPRODUZIONE DI BRANI MUSICALI] EZRA Zigmond: Hi, everyone. Grazie per essere venuti oggi. Questo seminario è "Python Web Apps con la boccetta. " Così, ho intenzione di parlare un po 'sul perché si potrebbe desiderare di utilizzare Flask fare applicazioni web con Python, in contrapposizione ad alcuni altri quadri là fuori, come Django, che è il più noto. Il sottotitolo è "e Peewee ", che è qualcosa stiamo andando a parlare di come di interagire con i database SQL. Lo rende davvero bello. Così, qui è solo un breve riassunto di ciò che voglio andare oltre. Quindi, in primo luogo, solo una diapositiva che sta per essere quickstart, che è come ottenere tutto impostato sul vostro computer. Ho intenzione di essere la dimostrazione questo sulla mia macchina Mac locali, proprio perché è lì che ho fatto questo prima, sono più comodo con esso, ma questo è sicuramente possibile sulla CD50 IDE. Così, dopo che, voglio introduce ciò che è Flask, e convincere perché si dovrebbe usarlo in primo luogo. Poi, io darò una rapida esempio di ciò che può fare in Flask, un esempio veloce di ciò che si può fare in peewee, e poi vi mostrerò più applicazione esempio completo che ho messo insieme che noi può camminare attraverso insieme. E infine, in l'ultima diapositiva, ho alcune risorse che si guarda in linea per ulteriori informazioni. Questo non è un completo tutorial come utilizzare Flask. E io spero di lasciare po 'di tempo per le domande. Chiunque guardando a livello locale, solo come, gridare in mezzo se hai qualche domanda. Così roba installazione rapida, se si vuole seguire, o se si desidera ottenere questo up sulla propria macchina, Ho intenzione di utilizzare Python 2.7.10. Boccetta funziona con Python 3, ma mi piace utilizzando Python 2, perché non c'è alcuni pacchetti Python che non funzionano con 3 ancora. Se avete installato pip, che è un gestore di pacchetti di Python, Penso che se il vostro Python è maggiore o uguale a 2.7.9, lo avete già installato, è super facile da installare questi pacchetti. Si può fare installare pip Flask, pip installare peewee, di solito è necessario eseguire sudo solo in modo che i permessi di lavoro fuori. E, se si utilizza un eccellente vecchia versione di Python, Mi consiglia di aggiornare il tuo Python, o utilizzando EasyInstall installare pip. Così, la prossima domanda è, che cosa è Flask? E credo che, prima di un domanda ragionevole Mi chiedevo per un lungo periodo è, che cosa è una web app? Perché questo è una parola che mi pensiamo sia gettato in giro un sacco che io non lo so. E penso che il migliore esempio di ciò che una web app è, è davvero CS50 Finanza, dove in realtà non è solo un sito web, ma è qualcosa che si potrebbe sorta di interagire. Ci sono gli account utente e ogni sorta di cose diverse. Allora, dove esattamente si disegna il linea di demarcazione tra ciò che è un sito web, e ciò che è una web app, è una sorta di arbitraria, ma credo che l'idea, è qualcosa di più di un sito web ed è un utile applicazione. Così, Flask è un framework per rendendo applicazioni web utilizzando Python. E si spera, entro la fine di questo, voglio convincervi che si potrebbe effettivamente scrivere qualcosa come CS50 Finanza con Python, che ho come molto meglio di PHP, personalmente. Quindi, è Flask, che chiamano un microframework, con la quale, significano che è molto semplice, ma estensibile. Così, ha proprio quello che serve, ma se volete più funzionalità, è facile portarli in. Ma solo perché si tratta di un microframework, non fa vuol dire che è solo per i piccoli progetti. Ho un link qui che dice che Obama ha usato Flask nel 2012 per la sua campagna sito web, che si spera, è qualcosa di un'approvazione. Ma la cosa che mi piace molto su Flask è che, in realtà non fa qualsiasi tipo di decisioni per voi. Proprio perché siamo parlando di applicazioni web, Devo confrontarlo con Ruby on Rails e Django, entrambi i quali sono grandi quadri, ma entrambi fanno supposizioni su come si desidera interagire con i database, come si desidera presentare il vostro vista, e sono sicuramente buoni aspetti che. Per esempio, Ruby on Rails ha questo sistema di registrazione attiva, che è davvero un bel modo di interagire con i dati, ma se si desidera utilizzare Ruby on Rails, che stai sorta di legati in quello. Ma con Flask, come io sarò mostrare con peewee, è possibile utilizzare qualsiasi tipo di database che si desidera, e si può solo tirare che a come estensione nella boccetta. Ecco, questo è il motivo per cui ho davvero come Flask, è che non fare ipotesi per voi sulla base di cose che non hai bisogno davvero. Quindi, perché si dovrebbe utilizzare Flask? I vantaggi sono, semplicemente ha davvero le caratteristiche principali costruito in lui di cui avete bisogno. Quindi, non dovete preoccuparvi di capire un sacco di cose che non si ha realmente bisogno. Non dovete avere a preoccuparsi su disattivando le funzioni che non si ha realmente bisogno. E, come ho detto, è super facile aggiungere a estensioni di cose che si ha bisogno. Alcuni di loro, ha Flask il proprio supporto per esso. Quindi c'è qualcosa chiamato Flask admin, che rispecchia quella amministratore pannello che Django fornisce, che ti dà un modo visivo piacevole per amministrare il vostro sito web. Ma ancora una volta, se siete fare qualcosa di semplice, probabilmente non è necessario un grande amministratore pannello, in modo penso che sia super bello. E gli svantaggi sono che si hanno meno potere, fuori dalla scatola. Così, quando si apre Flask, e nel vostro programma Python, basta digitare da Flask import *, o qualsiasi altra cosa, non esattamente ottengono tutti le caratteristiche che potrebbe desiderare. E quindi bisogna più esplicito elencare le caratteristiche desiderate. Ecco, questo è uno svantaggio, ma io ritengono che per la costruzione di piccole web applicazioni come sto andando a mostrare tu, che non è davvero un problema. E che l'ultima cosa che è dovrebbe dire, che è un errore di battitura, è che vi sono meno standardizzate convenzioni per come utilizzare Flask, semplicemente perché non ci sono tanti persone che lo utilizzano professionalmente rispetto al Django. Quindi, se si guarda qualcosa di simile, "come posso fare x" di Django, probabilmente lo troverete. C'è una buona progettazione modelli che è possibile utilizzare, ma con Flask, è sorta di seguire la propria strada, solo perché è un piuttosto piccola biblioteca. Così quelli sono il svantaggi, ma credo che che è ancora una buona biblioteca per l'uso. Così facciamo solo saltare a destra in boccetta. Questo è sicuramente non andare per essere un tutorial completo, ma è per darvi un'idea di come strutturare le cose, e così si sente comodo andare fuori e guardando la documentazione e scoprire di più. Quindi, mi apro un davvero semplice esempio all'inizio, e tu cosa che mostrerà sembra, e poi faremo scomposizione un po 'di più. Quindi questo qui, mi permetta di ottenere in esecuzione. Così, ora ho la mia applicazione in esecuzione. Sto per aprire Safari, e su cui sta girando il mio host locale. Così sto solo andando a fare questo grande. Ma localhost: 5000 E così, proprio ora, tutto questo fa è, quando si visita il sito, esso stampa "Ciao Flask," che non è super utile, ma penso che sia fresco che in questo piccolo file di qui, abbiamo un server Web che esegue che sta stampando qualcosa. Quindi, diamo un'occhiata in realtà il codice per un secondo, e scomposizione un po '. È la dimensione un bene per tutti qui? Così, si spera, si è un po ' agio con Python. Sto assumendo che possiamo guardare Python e leggere attraverso di essa. Se avete domande su niente, posso anche andare oltre questo. Quindi la prima riga è, da Flask, importiamo, Flask con un capitale "F" che è una specie di tutti i caratteristiche fondamentali di cui avete bisogno. Ogni volta che si sta scrivendo un file e usando Flask, si sta andando a voler importare che, solo perché che ha tutte le cose principali. La prossima cosa che facciamo, siamo noi chiamare questa funzione Flask, appena per creare un oggetto applicazione, e sei sempre andando a volerlo fare. E poi, saltando giù al fondo in fretta, questa parte è qui, 'if_name _ == "_ main_"', che è una sorta di convenzione Python. Quindi questo sarà solo eseguito se si eseguire il file direttamente utilizzando Python. Poi, noi chiamiamo app.run, che sarà effettivamente iniziare l'applicazione in corso. Quindi, questa è la struttura principale che avrete in qualsiasi applicazione Flask, è si avrà questo app = Flask (_name_), e poi app.run. Così, le due cose che ho qui, siamo ciò che noi chiamiamo percorsi. Quindi, parliamo di instradamento un po 'di più. Tornerò alla diapositiva. Così il più fondamentale concetto di Flask è il routing. Ed è l'idea che si assegnare funzioni in Python agli indirizzi particolari sulla tua pagina web. Così, ogni volta che vuoi per creare un nuovo itinerario, si utilizza questo @ app.route funzione di decoratore. Quindi, se si ha familiarità con decoratori funzione in Python, è questo concetto che Consente la ripresa di una funzione e surround con qualcos'altro. Quindi, in realtà, ciò che questo decoratore fa, è che prende la funzione sotto di essa, e aggiunge ulteriori informazioni ad esso, ma quello che realmente Flask fa a realizzare questo non è super cruciale, ma ciò che è importante, è che prima del percorso, si mettere questo @ app.route, e poi l'indirizzo del percorso, quindi la barra è ciò che visto quando abbiamo appena apriamo la pagina web. Ecco, questo è il homepage. E 'solo il percorso barra. E allora avete questa funzione. Il nome della funzione può essere quello che vuoi. Essa non deve necessariamente hanno a che fare con il percorso. E poi, qualunque cosa ritorno della funzione, la funzione dovrebbe restituire una stringa. E tale stringa può contenere HTML o qualsiasi cosa, e che in realtà è quello che otterrà restituito al browser web come HTML, e renderà tale. Quindi questo è lo stesso codice che era dall'esempio che ho appena eseguito, così quando visitiamo barra, si chiama una funzione Ciao Mondo, che solo restituisce una stringa, Ciao Flask, e che viene stampato sullo schermo. Quindi c'è un altro esempio, che è, quando si visita / ciao, esso stampa Ciao Parola, che dovrebbe effettivamente dire, Ciao Mondo, ma facciamo finta che era intenzionale. Quindi cerchiamo di tirare che fino reale veloce. Quindi, se si va a localhost / ciao, sarà ora stampare qualcosa d'altro. Ecco, questo è solo un esempio veloce di come è possibile creare due percorsi diversi. Così, finora non è super utile, Non c'è un bel po 'che si può fare, si può solo fare tutto questo con aventi differenti pagine HTML, e quando si visita un particolare Pagina semplicemente carica la pagina. Quindi cerchiamo di vedere ancora un po ' cose utili che si possono fare. Quindi, una cosa che si potrebbe avere notato nell'esempio che ho tirato up, è che avevo app.run (debug = True). E così, ciò che questo argomento di debug fa, è che quando si esegue il server web, quando siete nella vostra applicazione, se si modifica un file, lo farà ricaricare automaticamente il server. E così che in realtà non è necessario riavvio Python, che è super utile. Posso dimostrare che. Permettetemi di tirare su il mio codice con l'errore di battitura in esso, e far finta che errore di battitura è stato messo lì intenzionalmente a fini istruttivi. Quindi aggiungiamo questo torna in. Così ora si dice Ciao Mondo. Io salvarlo. E se tiriamo indietro il terminale, ti dire che è il riavvio, perché rilevato un cambiamento, e così ora, quando ricarichiamo la pagina, si stamperà la cosa giusta. Così debug è super utile per questo. Inoltre, se avete qualunque sorta di incidente, così vorrei fare questo incidente applicazione avendo esso non restituisce una stringa. Quindi, facciamo solo averlo Nessuno tornare per qualche motivo. E poi, quando mi trovo a visitare questo pagina, sarà solo in crash, ma il server non solo in crash, è in realtà ti dà una posteriore super utile traccia di tutto ciò che è andato storto. E che cosa è veramente bello, è che in ogni passo in questa traccia posteriore, si potrebbe aprire un interattivo shell qui, e una sorta di stampare ciò che variabili si vuole dare un'occhiata a. E così debug è davvero utile per capire quello che sta succedendo con il tuo Server, piuttosto che vedere qualcosa in PHP come un 500 interna errore del server, che è super inutile. Una cosa da tenere presente, è che se si mette la vostra applicazione in linea quindi è visibile al pubblico, è non vuole lasciare la modalità di debug, perché la gente può effettivamente usare quella console che io ha mostrato di eseguire codice arbitrario. Così possono stampare come ogni codici segreti che avete in là, essi possono guardare esattamente come il vostro sito web è in funzione. Quindi è davvero utile per i test, ma sempre assicuratevi di prendere fuori prima si pubblica qualsiasi cosa online. Così, quando si sta utilizzando qualcosa come PHP, c'è questa idea che è possibile passare informazioni tra le pagine web mettendo le informazioni in realtà nella URL, che è una richiesta GET, ma a Flask, si può effettivamente fare qualcosa di un po 'come quella, avendo un percorso che ha una variabile come parte di esso. Quindi, se si guarda a questo esempio sullo schermo qui, abbiamo un percorso che è ('/ ciao /'), e quindi, se si visita / ciao / qualcosa, quel qualcosa sta per ottenere effettivamente pieno nella variabile nome. E notare che la funzione che viene fornito con quella rotta deve prendere nel parametro nome, in modo che sarà effettivamente avere superato nella funzione. E poi, una volta che sei all'interno di tale funzione, si può trattare che, come una variabile normale di Python, e così poi, lo farà stampare Ciao, ed è riempirà il nome utilizzando qualche formattazione di stringhe. Quindi, per aggiungere parti variabili di un percorso, si utilizza la marcatura parentesi angolare. E, facoltativamente, è possibile utilizzare quello che chiama un convertitore. E così, se si mette questo annotazioni con i due punti, è possibile specificare che si tratta di un int, o di un galleggiante, o percorso, e convertirà automaticamente. È anche possibile fare la conversione all'interno della funzione di Python, semplicemente utilizzando un cast, ma a volte se si vuole essere sicuri che si tratta di un int, si può mettere che regola di conversione in là. Quindi cerchiamo di tirare su un esempio di alcune regole variabili. Ecco, questo ha la stessa base struttura con l'importazione da Flask Flask, la app = Flask (_name_), e quindi è in esecuzione alla fine. Abbiamo questi due diversi percorsi variabili qui. E il primo, è quello che ho mostrato nella slitta, cioè che ci vuole solo un nome di stringa e stamperà Ciao, Nome. E poi, la seconda si usa la conversione. Quindi questo convertirà automaticamente a un int, e quindi raddoppiare il int, e stampare che fuori. E, non facciamo alcun tipo della conversione al suo interno perché Flask si occupa di questo. Quindi cerchiamo di ottenere questo correre. Quando si ha un Flask applicazione in esecuzione, È possibile controllare-C fuori di esso per arrestare il server in esecuzione. E poi io correrò le variabili. Così andiamo a localhost / ciao / Ezra e si spera, questo dirà ciao a me. Così ha preso nel mio nome, nella variabile percorso, e riempì in qui. Così farò anche mostrare un rapido esempio del raddoppio. Quindi, se si va a / doppio / 3, si stamperà 6. Quindi questo è preso cura di la conversione per noi. Così si può anche farlo con galleggiante, e qualcosa di speciale, se è necessario specificare qualcosa di simile un percorso, che gli permette di accettare barre, ma che non dovrebbe normalmente essere un problema. Finora abbiamo, ancora appena stato il ritorno stringhe, che non è molto interessante. Abbiamo potuto tornare stringa HTML letterale. Così nel codice possiamo inserire qualcosa come il b-tag per renderlo grassetto, ma la maggior parte del tempo si realtà non si vuole per essere la scrittura di codice HTML nel codice Python. Diventa davvero disordinato, e non è un buon momento. Flask permette di separare il HTML in quello che viene chiamato il modello, e quindi se stai pensando in termini di modello MVC che si ha familiarità con, si spera, dal lavoro con CS50 Finance un po ', si può pensare di file Python come più del controllore, dove stanno interagendo con qualunque modello di dati si possa avere. E poi stanno chiamando fuori al Visualizzazioni e passare le informazioni a quella vista a compilare le informazioni in HTML che ha bisogno. E ciò che chiamiamo quelle Visualizzazioni sono modelli in classe. Così Flask usa un altro Python modulo che lo farà automaticamente installare quando si installa PiP Flask chiamato Jinja, che consente di aggiungere questi annotazioni HTML che si vede sullo schermo, che permette si mettono in cose come condizionali, e loop nel codice HTML. Quindi sembra un po 'come come si potrebbe utilizzare PHP all'interno di un file HTML, ma questo è solo quando la Flask Server serve il file HTML, verrà eseguito questo motore di template e analizzare attraverso questa e compilare le cose in. Così Flask ha una funzione render_template che potete vedere in fondo qui. E così quando si visita questa pagina, renderebbe questo hello.html modello, e poi riempire questa pagina HTML. Così facciamo solo eseguire questo vero e proprio rapido, e vedere che cosa assomiglia, e poi andrò attraverso un po 'più in dettaglio. Così, i vostri modelli sono in corso di andare in una cartella Modelli. Si farà il punto automaticamente entro il Cartella Modelli per questo modello. Quindi cerchiamo di aprire questo. Quindi, io correrò l'esempio Templating. Quindi, se vado a / ciao / Ezra, ha questa orribile, odioso tag marquee che ho messo in. Molto bello, molto dinamico. Io sono un grande fan. Ma cosa succede se Mi basta andare a, / ciao? Così appena dice Ciao Mondo. Non ho fatto passare un nome, e ha riempito in modo automatico. Vediamo quindi come ha fatto, e come siamo in grado di sbarazzarsi di quel tendone forse. Ecco, questa è una sorta di un esempio interessante di, se siete a conoscenza di come interruttore dichiarazioni lavorano in una lingua. Dire questo è un po 'come, quella sorta di una caduta attraverso, dove realmente attaccati due percorsi diversi per la stessa funzione. Quindi diamo il / ciao percorso e il / ciao / nome della rotta a Ciao, e specifichiamo using-- Python consente di specificare la funzione di default arguments-- quindi se non vi è alcun nome, così se andiamo a solo / ciao, che filtrerà automaticamente a nome è uguale a None. Allora, rendiamo il Modello con nome = nome, quindi passerà nel parametro nome pari a questo parametro la funzione nome, nel modello. Che ancora non spiega come è decidere se stampare Ciao Mondo, o stampare il mio nome. Quindi cerchiamo di guardare in realtà nel modello stesso, e vedere dove che proviene. Quindi, in questo modello, abbiamo in realtà hanno una logica condizionale, che alcune persone avrebbero sostengono, in realtà non dovrebbe avere un sacco di condizionale la logica all'interno del vostro modello stesso. Dovrebbe essere più all'interno Controller, ma per questo esempio si tratta di qualcosa di molto piccolo. Così qui, controlliamo, se il nome, in modo da se il nome non è uguale a None, se un nome è in realtà passato in, poi ci sarà dire Ciao, un nome con il intestazione e il tendone, tutto questo normale HTML, altrimenti, stampare Ciao, Mondo appena normalmente. Così un paio di cose da notare qui di come si formatta il template, è che, tutti questi istruzioni condizionali, un po 'come il modo in cui PHP quando si desidera inserire un po 'di PHP, si utilizza il meno-che domanda segno, è una sorta di analogo qui con il {%. Ecco, noi abbiamo il nostro codice condizionale. E poi, quando si vuole realmente letteralmente valutare qualcosa, e la stampa fuori per lo schermo, utilizzare le doppie parentesi. Così qui sono i doppi parentesi graffe, e poi specifichiamo nome, entro questo, si valuterà al nome della variabile, che è stata approvata dalla render funzione template, piuttosto che solo la stampa fuori, se ci siamo liberati di questi, sarebbe solo stampare la parola "nome". Quindi, questo è qualcosa da guardare fuori per. Quindi, un'altra cosa da avviso è che, quando ci desidera utilizzare la Funzione render_template, in realtà abbiamo importare esplicitamente da Flask. E questo è un esempio di la modularità di Flask, che non è necessario importare cose che non ti servono. Si può solo portare nel funzioni che in realtà hanno bisogno, che a volte è bello, in modo da non fare avere tutte queste funzioni seduti intorno che non si sta usando, ma anche, se si dimentica che si bisogno di importare render_template, probabilmente otterrete un avvertimento che ti consente di sapere a tale proposito. Così, questo è templating. Quindi, abbiamo dimostrato come rendere semplici pagine web, e aggiungere un po 'più logica per essa, in termini di instradamento variabile. Ti permette di fare cose diverse in base a ciò che si va a URL, e anche allora, dare il codice HTML un po 'più senso termini di come si vuole rendere le cose. Non è necessario mettere tutto il codice HTML in Python, ma per quasi ogni applicazione web, si sta andando a volere una sorta di modello di dati associati con esso. E così per tradizione, questo sarebbe essere qualcosa di simile a un database SQL. E si può solo interagire direttamente con SQL. Python ha, credo che si chiama. SQLite 3. Si può solo importare SQLite 3 e eseguire direttamente query SQL, ma io non so voi, ma io davvero non mi piace, solo, scrivendo query SQL. Esso tende a diventare davvero lungo e complicato. E così, cosa che Mi piace usare è ciò che è noto come ORM, che è un object-relational mapping. E il punto di object-relational mapping, è che ci sono due differenti modi si può pensare di database. Quindi l'esempio che Il professor Malan solito usa in classe, è la tabella Excel, dove ci sono queste righe e le colonne, e questo è davvero utile per come è rappresentato in SQL e come interagire con esso, ma un altro modo che in realtà utile pensare a questo proposito a volte, è in termini di classi e oggetti. Così, invece di pensare di ogni tabella come aventi questa riga che ha determinato informazioni, si può effettivamente pensare ad esso come ogni tabella è una classe, e quindi ogni istanza della classe ha alcune proprietà. Quindi, in questo esempio, le istanze di la classe sono le righe della tabella, e poi ogni proprietà sarebbe essere una colonna della tabella. Così, l'ORM che mi piace utilizzare si chiama peewee. E 'davvero piccolo, un po' come Flask. Penso che vanno bene insieme, ma ci sono un sacco di altri ORM che è possibile utilizzare. Uno più popolare è noto come SQLAlchemy, e non riesco a ricordare perché ho inizialmente ha scelto Peewee su SQLAlchemy, o Vorrei dirvi perché io penso che sia il migliore, ma stiamo solo andando a utilizzare questa uno perché so come usarlo. Quindi, una domanda è, perché dovrebbe preoccuparsi usando un ORM, invece di direttamente scrivere query SQL? E penso che il caso migliore, è che non si fa in realtà necessario scrivere query SQL. È molto più facile, come ti faccio vedere, a fare le cose come selezione, inserimento, l'eliminazione, in particolare la creazione di tabelle. E 'molto più facile scrivere la struttura di classe, che è di strutturare un Create TABLE, ma una cosa di essere a conoscenza, è che l'ORM farà del suo meglio per capire quale sia il più interrogazione SQL efficiente sarebbe, ma a volte si sbaglia. E soprattutto se siete lavorando con una grande base di dati, si può notare che una query che dovrebbe essere in esecuzione veloce, è in realtà più tempo. E se si guarda sotto il cofano di come l'ORM che sta interpretando in SQL, si potrebbe fare qualcosa veramente ridicolo, solo perché è una sorta di indicò le vostre intenzioni sbagliato. E, ci sono stati momenti in cui Ho dovuto ignorare esso, e solo eseguire le mie query SQL, appena perché ha analizzato in un modo strano. Quindi, vi è una certa sovraccarico, solo in modo che compila il tuo dichiarazioni giù in SQL. Quindi, diamo un'occhiata eccellente rapidamente a un semplice esempio di un modello di dati che si potrebbe utilizzare. Quindi, questo è il codice Python, e quindi la prima cosa che voglio fare è da import peewee *. Quindi, a differenza di Flask, dove si ha tutti questi singoli moduli, e si desidera importare Flask, e scrivere un modello, e alcuni altri che vedremo in seguito, da peewee, si può semplicemente importare tutto, perché è un piuttosto piccola biblioteca. Quindi, la prima cosa che si vuole fare, è effettivamente creare questo oggetto di database. Quindi, avete db = SQLiteDatabase, e poi il nome del database. E questo sarà effettivamente creare un oggetto di database che è possibile interagire con, con peewee. E poi, abbiamo la reale modello che vogliamo creare. Quindi la tabella che vogliamo creare. Quindi, all'interno di peewee, ogni classe ha la propria tabella all'interno del database. Quindi, tutte le classi ereditare da il modello base, e il modello M maiuscola è qualcosa che è definito in peewee. Quindi, tutti i modelli dovrebbero ereditare, come loro supremo superclasse, essi dovrebbero ereditare dal modello, ma ciò che è davvero cool, è che si può effettivamente avere il vostro modelli ereditano le une dalle altre. E un sacco di tempo, il vostro modelli di dati non necessariamente fare una gerarchia di ereditarietà bella, ma tempi in cui lo fanno, è davvero bello, perché avete il modello inerente l'uno dall'altro. Così, abbiamo definito questa classe 'studente', che eredita un modello, ed ha tre proprietà. Ha un ID, che è un PrimaryKeyField, che è qualcosa che ha fornito by Peewee, nome è un CharField, e un grado è un IntegerField. Quindi questo può o non può essere come CS50 memorizza in realtà tutto voti degli studenti. Non è, ma questo è come lo farei. E poi ha, dentro questa classe, e questo è qualcosa che si può fare con Python, è possibile avere classi nidificate. E questo è qualcosa ciò che è richiesto da peewee. Quindi, questa classe di Meta, si ha per specificare che il database è uguale all'oggetto che abbiamo creato in precedenza. E questo dice ciò file è questa tabella in realtà sta per essere contenuta in. Quindi questo è qualcosa che si deve a fare all'interno di tutti i modelli. Devi solo specificare all'interno di questa classe di Meta tale database è pari a db. Quindi quello che di solito fare, se ho un sacco di modelli diversi, è che ho una base il modello, che di solito basta chiamare "modello base" che ha la classe Meta, e imposta il database pari a db. E poi tutti i miei modelli successivi erediteranno da questa classe di base. E poi io non devo preoccuparmi sull'impostazione della classe di Meta. Così, quando questo diventa realtà compilato giù in un'istruzione SQL, sembra che questa cosa brutta giù qui, "Crea tabella ID studente intero, " qualunque. E, penso che sia più breve, questa query SQL proprio qui, ma se si guarda a questa classe qui potete vedere esattamente cosa sta succedendo. Potete vedere quali tipi di campi ci sono, cosa stanno sono chiamati, e così, penso che guardando questo codice Python è molto più leggibile di cercando di scrivere questa query SQL. Quindi, al fine di effettivamente utilizzare il database, dobbiamo per connettersi ad essa all'interno Python. Quindi, io di solito scrivere una funzione chiamata initialize_db che fa due cose. Prende nel database oggetto db e collega ad esso, che si apre solo fino sezione al database. Se siete solo in esecuzione anche se sito web sul computer locale, non è un super grosso problema di cui preoccuparsi su come collegare e scollegare, ma se si esegue su un sito web, vuole fare in modo che, ogni volta che un utente collega ad esso, quando chiudono fuori il sito web, in modo che si disconnettono non avere un gruppo di persone connesse al database tutto in una volta. E poi, quando si la connessione al database, si desidera chiamare db.create_tables, ed elencare i modelli per ciò che si vuole per creare le tabelle. Così qui, voglio solo creare per questo studente. E poi, ciò che è importante, è quello di specificare sicuro = True maggior parte del tempo. Così che cosa questa dichiarazione farà, è che crea tabelle per il studente modello, ma solo se quel tavolo non ha stato creato già. Questo è ciò che le specifica di sicurezza. Così non sovrascriverà la vostra tabella esistente, creerà solo una nuova tavolo se non c'è uno c'è. Quindi, si può solo creare le tabelle di una volta utilizzando SQL. E poi seduta in tale banca dati lì, e quindi connettersi a ogni volta, ma di solito è bello solo per mettere nel presente invito create_tables, in modo che, se mai elimina il database quando si esegue il web di nuovo app, sarà ricrearlo. Quindi, basta assicurarsi che al sicuro è specificato per essere vero, o troverete i vostri dati appena ottenendo colpita ogni volta. E poi, si può chiamare initialize_db stabilire una connessione e creare tavoli se necessario. Quindi, la cosa più comune che si vuole fare, o una delle cose più comuni, è da inserire in realtà le cose nel database. E così, invece di dover di scrivere un INSERT INTO dichiarazione con tutti I valori indicati, si può effettivamente chiamare funzione sulla classe studente. Così, quando si crea una classe che eredita dal modello, ha questa creare metodo. Quindi, fate classe name.create, e di specificare i parametri che si desidera passare a. Quindi, se voglio aggiungere alcuni studenti al nostro esempio CS50 libro grado, Mi metterò a David, che ha un molto buona qualità, ha un 95. E io, che non sta facendo così bene in CS50, ho un 50. E così, la cosa bella di cosa questa funzione creare fa, è che restituisce l'istanza, o fila, che ha creato all'interno della tabella, e così poi si memorizza che in un variabili, e il lavoro in un secondo momento. È possibile cambiare intorno, che Ti faccio vedere un esempio di. Notate che non ho devono specificare l'ID, perché essendo la PrimaryKeyField, che verrà automaticamente incrementarlo se non viene specificato esso. E, in realtà, probabilmente non deve specificarlo, perché si potrebbe accidentalmente clobber ID di qualcun altro. E si vuole fare Assicurarsi che è unico. Quindi, in realtà, il più cosa comune che si vuole fare, probabilmente è selezionare fuori del database una volta hanno un sacco di informazioni in là. E così, se si vuole ottenere tutto, così l'equivalente della stella select dalla dichiarazione studenti, è sarebbe solo student.select. E che vi darà indietro un array con tutti gli studenti oggetti in esso che di eseguire iterazioni su volete. È possibile ottenere le cose fuori di esso. E la maggior parte del tempo, è non voglio solo fare selezione, che realmente desidera specificare qualcosa. E così, è possibile concatenare insieme queste chiamate di funzione, come come si farebbe a catena insieme le dichiarazioni in SQL. Così si può fare student.select (). Dove in questo esempio. E poi, si può specificare le condizioni, solo utilizzando Python normale Booleane per controllare le cose. Quindi, in questo caso, si vuole limitare ciò che si sta selezionando per, dove student.grade è uguale a 50, e student.name è uguale a Ezra, in modo che sarà solo mi uscirne. E notare, uno davvero cosa sottile ecco che, se si desidera specificare una e / o OR e / o, in Python, che si usa normalmente, Penso che la parola "e" in realtà, ma qui si utilizza il singolo commerciale, che normalmente è un operatore binario, ma in questo caso particolare, solo il modo peewee fa, si utilizza il singolo commerciale per specificare "e." Questo è qualcosa che Mi si confondono un sacco, ma non compare tanto in pratica. E poi, una volta che avete tutti gli studenti fuori della base di dati, una volta che avete fatto siete select e la vostra usura o qualsiasi altra cosa, è possibile utilizzare un ciclo foreach, proprio come normale in Python, con qualsiasi tipo di iteratore o con qualsiasi tipo di matrice. Così si può fare, per s in student.select (). whe re (Student.grade <75), e quindi questa volontà iterare su ogni studente nella tabella la cui qualità è inferiore a 75, che in questo caso, è ancora solo a me. E allora si potrebbe fare qualcosa entro quel ciclo, come me invia un'email e io in realtà dire girare nei miei insiemi di problemi. Quindi, un'altra cosa è possibile fare, è è davvero facile aggiornare righe all'interno della tabella. Quindi, ricordate di nuovo qui, la tua quando ho inserito, Ho preso il valore che era restituito da student.create, e ho assegnato a nome chiamato Ezra. E così ora, è possibile cambiare la I valori all'interno di tale istanza, proprio come si farebbe con una classe normale in Python. Così si può impostare ezra.grade = 95 e che aggiornerà la copia locale, ma se si vuole realmente commit che il cambiamento di banca dati, devi chiamare ezra.save, così si chiama il metodo .save l'istanza. E così ora, ho cambiato con successo la mia prima scelta all'interno del database. Così, allora diciamo che mi beccano cambiare il mio grado all'interno del database. Il professor Malan è destinata probabilmente a voler eliminare me dalla classe, e così si può chiamare il .delete metodo di istanza proprio su quella cosa. Quindi, se si voleva andare di nuovo in questo ciclo qui, e in realtà, invece di invio di email tutti degli studenti il ​​cui grado è meno di 75, si voleva eliminarli, all'interno di questo ciclo si potrebbe chiamare istanza s.delete. E l'ultima cosa che vuoi fare, è ogni volta che si stabilisce una connessione, e il gioco è fatto con il vostro lavoro, si desidera chiamare db.close, dove db è quel database obiettare che avevamo prima. E si vuole fare in modo che tutto viene chiuso fuori. Raffreddare. Così ora, ho un esempio di applicazione. Ho una sorta di pre-fatto tutto solo in modo che non ci sarà alcuna codifica diretta errori, ma siamo in grado di camminare attraverso e vedere come si possono mettere Flask e Peewee insieme, e fare una semplice applicazione. Io lo chiamo CS50 declamazione, ed è una sorta di semplice piattaforma di blog. Quindi, in primo luogo, corro e mostrano quello che sembra, e poi possiamo guardare più nel codice. Okay, facciamo solo eseguire questo. Fresco, farò questo un po 'più piccolo. Non è molto bella, proprio perché Non ho fatto un sacco di CSS, ma ciò che fa è, ha Questo database di post sul blog, e passa attraverso tutti loro, e li visualizza sulla pagina in ordine di più recente. E così questi sono solo alcuni messaggi che avevo salvato nel database. Quindi, se vogliamo creare un nuovo posta, possiamo andare ad aggiungere un nuovo post, e siamo in grado di inserire il titolo della post, in modo simile, CS50 seminario. Wow, davvero godendo il seminario. Raffreddare. Poi si stampa post, e sarà Per favore usare torna alla home page, e poi vedrai che è stato aggiunto il nuovo messaggio. E abbiamo ancora tutti quelli lì. Così ora, facciamo un passo attraverso tutte le codice e vedere come questo viene implementato. Quindi, penso che la prima cosa che ti permette di dare un'occhiata a, è in realtà i modelli. Un sacco di tempo, quando si sta progettando qualcosa, si vuole pensare prima a come si sta andando a rappresentare i dati, e quindi progettare le cose intorno a quella, in modo che tutto ha un senso. E questo è in realtà come io lo ha fatto quando stavo facendo questo, Mi sono seduto e pensato, quello che voglio in un post. Così, qui, abbiamo la stessa struttura che accennavo prima, dove facciamo db = SqlDatabase ('posts.db'). In realtà, probabilmente non si vuole a codificare nel database del vostro nome. Questo dovrebbe probabilmente essere un parametro che è memorizzato da qualche parte, forse in un file di configurazione, ma in un piccolo esempio come questo, va bene il codice duro che in. Quindi ora, abbiamo questa classe Post, che eredita dal modello base. E ha, di nuovo, la ID = PrimaryKeyField. In realtà, se non si specifica, se io in realtà sono liberato di questo, allora Peewee ci prenderemo cura di creando automaticamente quel campo ID, e lo farà automaticamente ne fanno un PrimaryKey, che Penso che è veramente bello, perché di solito, questo è qualcosa che si desidera avere, ma mi piace metterlo in particolare, solo così mi ricordo che è lì. Ma se non si specifica che, che sarà lì automaticamente. Allora, ho un appuntamento che è un DateTimeField, e tutti questi diversi campi, se consultare la documentazione peewee, ti do una lista dei diversi tipi di campi che è possibile utilizzare. Per la maggior parte, è analogo a quello che si vede in SQL. Quindi c'è un CharField, un VarCharFields, TextField, che sono per molto tempo testi, come un post sul blog potenzialmente, DateTimeFields, DoubleFields, FloatFields, tutte cose del genere. E si può passare a altri argomenti ad esso, che non ha specificato qui. Diciamo, per esempio, tu non vuoi consentire a due posti di avere lo stesso titolo, è possibile specificare qualcosa come unico = True, e questo è solo un parametro in più per il campo che quando compila giù in SQL, specificherà che deve essere unico. È inoltre possibile specificare qualcosa di simile non nullo e tutte le altre cose si fa normalmente in SQL. Quindi, questo è un piuttosto semplice modello che ha la data. Notate qui, all'interno del DateTimeField, Ho specificato che cosa il valore predefinito è. Ho specificato che sia datetime.datetime.now, a causa del modo che questo viene valutato, in realtà valuta il DateTime.Now quando Viene inserito nel database. Penso che, mi piacerebbe avere per controllare due volte questo, ma se avete fatto qualcosa di simile, poi sarebbe in realtà la valutazione che una volta, e poi il DateTime sia sempre la stessa. Quindi, solo se si sta facendo qualcosa con datetimes, doppio controllo che sta valutando quando viene effettivamente inserita, oppure potrebbe essere confuso. Il titolo è solo un CharField, che ci sono più argomenti si può passare nello specificare esattamente quanto tempo voglio che sia, ma qui, non è davvero un problema. E testo sarà il testo di tutto il post, e che sta per essere un TextField solo perché si vuole per permettere che sia una bella lunga serie. Poi abbiamo questo Meta sottoclasse che proprio Specifica che vogliamo il database dove questo è in realtà aperto in per essere l'oggetto db che abbiamo qui. E l'ultima cosa che abbiamo qui, è proprio questa funzione che stiamo andando a utilizzare dalla nostra applicazione principale per inizializzare il database per la connessione a , e poi per creare la tabella Post. Ora, diamo un'occhiata a l'applicazione principale stessa. Quindi questo è un bel po 'più a lungo di quelli che abbiamo visto prima, ma speriamo non troppo male. Quindi, mi estendo questo fuori. Va bene. Così, notare e la parte superiore ho importato un sacco di altre cose da Flask che noi non abbiamo veramente visto prima. E si spera, possiamo passare attraverso ognuno di questi uno per uno e parlare un po 'di più li, scelte per esempio. Quindi, abbiamo la Flask, e il render_template, che abbiamo visto prima, questo oggetto richiesta, che arriverà quando si guarda a come la forma che stavo mostrando in realtà lavori. Redirect, che consente di reindirizzare di ritorno da Crea nuovo messaggio Torna alla homepage originale, e quindi URL, che è qualcosa che consente di capire dove sulla sito web una pagina particolare è. Allora, la prossima cosa che faccio, è che l'importazione tutte le informazioni dai modelli file che stavamo solo guardando. E, sì. Quindi, qualcosa di nuovo che viene quando hai a che fare con, soprattutto banche dati, è che è possibile specificare una funzione che viene chiamato prima ogni richiesta, e la funzione che viene chiamato dopo ogni richiesta, con questo Richiesta funzione decorator app.before. E così questo avrà eseguito laddove questa funzione è. Ciò non deve essere chiamato prima richiesta, ma di solito questo è qualcosa sensibile chiamarlo. È possibile specificare qualsiasi funzione si vuole ottenere chiamato lì, così ho specificato questo initialize_db funzione che abbiamo avuto di nuovo nei Modelli file, in modo prima di ogni richiesta, vogliono connettersi al database. Ci sono due diversi modi si può fare questo. Si può fareapp., I credere che sia after_request. E la differenza tra after_request e teardown_request, è che after_request accadrà soltanto se la richiesta effettivamente era valida. E così, solo se la richiesta ha avuto successo, se nulla è andato storto, ma teardown_request avviene nel caso di un successo richiesta, o nel caso di un errore. Così, di solito, si vuole utilizzare teardown_request, a meno che non si vuole fare qualcosa, soprattutto diverso nel caso di un errore. Ma per chiudere il database, se si riesce o se non riesce, facciamo si desidera disconnettersi dal database. Così si chiama, db.close sull'oggetto db. Si noti che il teardown_request prende in un'eccezione. Così si può controllare se c'era effettivamente un errore quando stava chiudendo, ma qui, si spera, ci Non sono un sacco di errori, quindi stiamo appena sorta di ignorare questo. Va bene, e il resto non è troppo male. Così, quando andiamo alla home page, abbiamo reso questo modello home.html che si aprirà. Il pass è in post uguale a, e che cosa questo fa è, ricordate che abbiamo questo post il modello, in modo da selezionare tutti i posti, e poi un'altra cosa che puoi fare, è possibile specificare la clausola WHERE, è possibile specificare un ORDER BY, e così prendiamo tutti i post che ottenere selezionato, e poi li ordiniamo dal post.date.descending. E che specificare, quando in realtà escono, il più recente sarà molto prima. E poi, si passa che in il modello home.html, quindi cerchiamo di realtà aprono che modello davvero veloce, e dare un'occhiata a come che sta lavorando. E questo non è grande HTML, ma si spera, possiamo concentrarci su Python. Quindi c'è un collegamento al Nuovo Post, e quindi questa specifica il percorso all'interno del Flask che abbiamo definire, che è proprio qui. Questa è la nuova rotta palo, e si precisa che quassù. E così che è un link che poi andare a quel percorso nel server Flask. La cosa più interessante è questo ciclo for qui. Quindi si precisa che questo parametro posto che è stata approvata nel Funzione render_template, per ogni post nel post di oggetto che viene passato in. Vogliamo stampare il titolo del post, nel 1 ° semestre, e poi sotto, vogliamo stampare il testo del messaggio all'interno di un paragrafo. E qui, si può effettivamente chiamare una funzione Python, così possiamo chiamare strftime, ST-RF-tempo, e si può passare nella stringa di formato che si desidera stampare i dati in. Quindi è abbastanza piacevole è che si può in realtà chiamare questa funzione Python dal di dentro qui. Non dovete fare la formattazione su il lato controllo, perché in realtà, formattazione della data è qualcosa che si vuole affrontare all'interno della vista. E tutti questi cento le cose non è super importante. Se si guarda la documentazione per la funzione strftime in Python, specifica tutti questi le cose, ma che di come, quando stavamo cercando nella home page qui, formatta questo con una bella la data, e specifica AM o PM, ma normalmente, se non ha avuto questo qui, probabilmente otterrete alcuni spazzatura data che non sembrava molto buono. E poi specifichiamo il post.text, e ho potuto hanno messo un paio di interruzioni di riga qui, appena di mettere alcuni spazi tra ogni post. Quindi, penso che il più importante cosa in questo esempio, è che è possibile utilizzare questo ciclo for. E questo è analogo a cose che si possono fare in PHP. È possibile scorrere, tutto viene passato a, e così, invece di dover fare copia / incolla, copia / incolla tutto il codice HTML, basta scrivere una volta, e poi è possibile iterare su tutti i posti. E questo è qualcosa comune che si desidera a fare, quando si hanno un sacco di dati, è che per tutto nei dati, si vuole fare una cosa simile. E poi, bisogna ricordare, che quando si consiglia di stampare qualcosa esplicitamente nel codice HTML, si utilizza la doppia parentesi qui, ma poi quando si desidera specificare alcune informazioni su una condizione, o di un ciclo for, è utilizzare il supporto per cento. Quindi, tornando al Python codice, in modo che spiega cosa sta succedendo nella principale percorso, quando ci andiamo, visualizza solo tutto il messaggi, ma allora la domanda è, come possiamo effettivamente ottenere messaggi nel database, che è un po 'più interessante. Così, quando si fa clic sul nuovo Messaggio collegamento, che abbiamo visto qui, vi reindirizza a questa forma. E questo è solo una semplice chiamata al Funzione render_template, che poi passa nel nuovo incarico in forma HTML. Quindi, diamo uno sguardo a questo. Quindi questo è abbastanza semplice. Ha una semplice form HTML, che cercherà un po 'familiare, sulla base delle forme in CS50 Finanza. E così, specifichiamo qui, l'azione. E qui, se si sta lavorando con PHP, normalmente, sarebbe qualcosa di simile, create.php, ma qui abbiamo effettivamente specifichiamo un percorso all'interno del server Flask. E così, questo asse corrisponde per creare il percorso che abbiamo qui, che andremo in in un secondo. E così, si precisa che si tratta di un metodo post, perché vogliamo trasmettere questi dati modulo, e di solito quando si sta inviando i dati da un modulo, si potrebbe desiderare di utilizzare una richiesta POST, solo così non si finisce con questo grosso, URL ingombrante. Ma si potrebbe anche utilizzare una richiesta GET, e passare con il routing variabili, ma per le forme, è bello ad una richiesta post qui. E così poi, proprio come te farebbe con HTML e PHP, è possibile specificare questi ingressi di testo, ed è possibile specificare il nome di loro, e questo è il nome che andranno passati nell'oggetto richiesta entro Flask. E poi abbiamo una Invia pulsante che dice Post. E qui, Post è il nome del Pulsante, perché è un post sul blog, ma qui, post è il metodo di richiesta. Così quelli sono la stessa parola ma in realtà non correlato. Sì Tornando al codice Python, quando abbiamo chiamato il metodo di creare, noterà qui che si può in realtà specifica all'interno della rotta i metodi di richiesta che si desidera accettare, e ecco, Preciso che io solo vuole accettare un metodo POST. Quindi, se ho effettivamente provato a visitare la pagina direttamente, che sta utilizzando una richiesta GET, essa mi dirà "metodo non consentito." E così, si dispone di pagine, un po 'come questa pagina creare, che sono solo davvero utilizzando come un modo per il modulo per ottenere presentato, è possibile specificare che non lo fai vogliono persone siano in grado di andare lì direttamente attraverso una richiesta GET, o se non volevi, per qualche motivo, una richiesta POST, si può solo specificare GET qui, ma in questo esempio, abbiamo appena vuole la richiesta Inserisci di uscire. Così, quando create_post viene chiamato, quando visitiamo che tramite la richiesta Post, ogni volta che si va in un particolare percorso, c'è questo oggetto di richiesta, e abbiamo dovuto importare richieste al vertice, ma c'è questa richiesta oggetto che viene passato in, ed è possibile accedere ai dati del modulo, che verrà automaticamente riempirsi quando si invia una richiesta da un modulo. E poi, quello che penso è davvero cool, è che l'oggetto modulo per ottenere passato in, è solo un dizionario Python che contiene, se access-- ecco, lasciare mi tiri su il codice HTML accanto ad essa, solo così si può avere che come riferimento, sì, così i nomi che specifichiamo qui per i diversi campi, quindi il titolo e il testo, abbiamo poi basta usare quelli qui come indici nelle dati del modulo. Ecco, questo è super conveniente. Allora chiamiamo post.create, che creerà e inserire automaticamente questo nuovo oggetto postale nel database. E penso che questa funzione crea ecco un esempio di come davvero cool potente Flask sta lavorando e con questo, perché se si stesse facendo qualcosa in PHP, potrebbe essere necessario fare un sacco di convalida, si dovrà poi stabilire una connessione al database, si dovrà poi eseguire la query SQL, ma qui dobbiamo solo questa bella post.create, che possiamo poi basta ottenere le informazioni fuori dell'oggetto richiesta, e poi passare in un nuovo Post che stiamo creando. E poi, l'ultimo cosa che vogliamo fare, è quello di reindirizzare la torna utente per la casa. E così usiamo questo Flask redirect funzione. E qualcosa che non aveva visto prima, era questa funzione URL. Così l'URL per funzione consente si passa in realtà il nome di una funzione nel codice Python, piuttosto che il percorso particolare che sta. Così ho potuto avere altrettanto facilmente reindirizzato a un utente di tagliare, che rispedirlo a casa, ma utilizzando l'URL per la funzione è bello, perché se si modifica il luogo in cui le cose sono, quindi diciamo che cambio il casa per essere in / home invece, questo sarebbe ancora poi tornare / home, perché in realtà va e guarda in alto il nome della funzione, e vi restituirà l'URL per questo. Quindi, una sorta di sulla presupposto che sei più propensi a cambiare le cose in cui sono, oltre i nomi delle funzioni. È possibile utilizzare questo davvero bello URL per la funzione. E una cosa da tenere presente che è un po 'difficile, è che si pensa si poteva solo chiamare reindirizzare sull'URL per, ma in realtà tutti i percorsi sono per restituire una sorta di testo e HTML, così realmente dovete restituire la chiamata di reindirizzamento. In caso contrario, si otterrà qualcosa invalido di non restituendo una stringa, perché tutti questi hanno per tornare il codice HTML si vuole realmente il rendering. E così, quando si chiama il reindirizzamento, che reindirizza alla pagina ma restituisce in realtà il codice HTML è necessario eseguire tale reindirizzamento. Torna alla homepage. Così abbiamo questi due punti di vista differenti. Noi abbiamo la vista a casa. O, credo che dovrei dire i modelli. Abbiamo questi due modelli, il modello di casa, che visualizza tutti i nostri post, e poi abbiamo questo annuncio cosa, e quando si fa clic sul post, va in un percorso all'interno della Flask, ma questa strada non lo fa necessariamente disporre di un modello corrispondente. Non è necessario vedere qualsiasi cosa, ma è ancora possibile ha questo lavoro in corso dietro le quinte. E poi si ottiene reindirizzato tornare alla home page. E sicuramente, è facile da lavorare in qualche CSS più bello nel modello e fanno di questo aspetto molto più gradevole, ma tutta la logica principale c'è in Python. Tutte le domande circa l'esempio? So che ci sono un sacco di cose diverse succedendo lì, un sacco di cose che non avevamo visto prima, ma come niente. Già. PUBBLICO 1: Dovete fare qualcosa speciale per fregare i dati che sono provenienti dalla forma? Ho notato che hai appena detto "creare" EZRA Zigmond: Sì, così che è in realtà, questo è davvero un buon punto. Quindi la domanda era, si fa bisogno di controllare e fare in modo che i dati sono validi, e fare qualsiasi tipo di lavaggio fare in modo che esso sia valido, perché, come potete vedere qui, Non sto facendo questo. Quindi vediamo cosa succede se inserisco qualcosa vuoto. Quindi, sarà in realtà solo fare una posto vuoto e compilare il DateTime. Quindi, in realtà, si sarebbe probabilmente voglia di fare qualcosa di simile, forse specificare se il titolo è uguale a la stringa vuota, allora non farlo. Oppure, farlo solo se il titolo è non uguale alla stringa vuota. Quindi in realtà non automaticamente prendersi cura di questo lavaggio per voi, quindi è ancora necessario farlo. Sì, buona domanda. PUBBLICO 2: Does it scrub per iniezioni sequel? Lo sai? EZRA Zigmond: Speriamo, peewee fa. Penso che sarebbe certamente una bella male biblioteca, se non l'ha fatto. Non lo so esattamente. Avrei dovuto guardare il query che ha generato. Penso che, se ho digitato in un post sul blog che genere di sguardo come un attacco di SQL injection, qualcosa di simile, se questo è come un campo password o qualcosa, si potrebbe fare qualcosa di simile. Penso che sarà ancora ottenere postato letteralmente, ma penso che peewee fa fare una sorta di lavaggio dei dati prima che effettivamente esegue. PUBBLICO 1: Questo campo di testo è progettato per prendere testo normale, giusto? EZRA Zigmond: Sì, lo è. Già. Quindi penso che tutto il, quindi questo è comportamento corretto, che lo farà, ma penso che peewee fa si spera fare una sorta di protezione sulla loro estremità. E se si voleva doppio controllo che, ci sono modi quando si genera una query. in modo da non dover eseguirlo direttamente. Avrei dovuto prendere un guardare la documentazione, ma si può effettivamente visualizzare la SQL che sta generando, e dare un'occhiata a questo, e fare Assicurarsi che fuoriesce cose. Un'altra ragione per cui si potrebbe vuole guardare SQL che Peewee è l'output, è se le cose sembrano andare molto lentamente, si può dare un'occhiata e vedere di cosa si tratta in realtà facendo, perché è a volte facile aggiungere accidentalmente in, il modo in cui si scrive, si può avere accidentalmente selezionare l'intero database prima, e poi fare qualche operazione di ordinamento su questo, quando si ha realmente lo scopo di selezionare un sottoinsieme. E così, se le cose non sono piuttosto andando a destra, è bene dare uno sguardo a richiesta Che in realtà è sempre generato. Già. PUBBLICO 2: Quando hai iniziato, si mette in porto nel 5000. EZRA Zigmond: Sì. PUBBLICO 2: E 'il default con peewee, o è qualcosa che si può cambiare? EZRA Zigmond: Sì, in modo che il porta è predefinita con la boccetta. Se si esegue senza specificando nulla, lo farà automaticamente. Credo, avrei per controllare due volte questo, ma è possibile specificare che nella app.run, Penso che si possa fare qualcosa di simile, port = 8080. Diamo che una prova reale veloce. Sì, così si può semplicemente specificare port = 8080, e verrà eseguito lì, che credo, se si voleva eseguirlo sul IDE, non ho provato questo fuori, ma credo che se si corse che sulla porta 8080, si sarebbe probabilmente in grado per accedere al server, proprio come se fossi per il sito web. Sì, ma è facile per cambiare la situazione, se si avere alcun tipo di come port-forwarding cose che dovete fare. Qualsiasi altra domanda? Sì? PUBBLICO 1: Allora, ho visto nella tua modelli che, come lei ha ricordato, è necessario specificare il database per ciascun oggetto. Ti capita di sapere, non che lo rendono davvero facile se si hanno un sacco di database SQLite che si vuole utilizzare per una singola applicazione web, che si può semplicemente specificare un mucchio di quelli diversi nel modello? EZRA Zigmond: Sì, mi permetta aprire che fino reale veloce. Quindi, stai dicendo, se si vuole avere un mucchio di diverso qualcosa, forse come e gli studenti, per alcuni ragione, qualcosa del genere? Sì, così penso che ancora, ogni modello avrebbe dovuto avere ancora solo un database assegnatole, ma se si voleva avere modelli diversi sono oggetti di database diversi assegnato ad esso, si potrebbe sicuramente fare. Quindi, se ho creato un nuovo, qualcosa come questo, e ora questo è uno studente che sembra stranamente come un post sul blog, Ho potuto specificare che il database è pari a db_2 qui. Quindi, penso che sia il via principale si può fare. Raffreddare. Qualsiasi altra domanda? Quindi, solo per finire un po ' bit, qui ci sono alcune risorse, e queste diapositive saranno pubblicate on-line così si può effettivamente arrivare a questi collegamenti. Le migliori risorse sono davvero la documentazione per Flask e Peewee stessi. Sono scritte molto bene, credo. Così, il sito Flask è qui, e hanno un tutorial quickstart che cammineranno attraverso simile cose da quello che ho camminato attraverso, ma se volete qualsiasi tipo di recensione delle cose che sono andato oltre, o si pensava che ho spiegato qualcosa in modo confuso, avranno esempi simili lì. Peewee ha una documentazione, e hanno un tutorial quickstart che va oltre i parametri principali che si desidera utilizzare. Così, le cose che ho parlato con le uniche, e specificando le impostazioni predefinite, i diversi tipi di campi è possibile utilizzare, quelli tutto sarebbe lì. Inoltre, se avete domande su peewee, e che pubblichi su StackOverflow, il ragazzo che ha fatto realmente peewee va avanti e risposte quelle volte. Se avete una domanda, si spera egli sarà in grado di rispondere, perché ha scritto il tutto. Penso che sia tutto Volevo coprire. Grazie per essere venuti.