[За възпроизвеждане на музика] Езра ZIGMOND: Здравейте, всички. Благодаря, че дойдохте днес. Този семинар е "Python Web Apps с Flask. " Така че, аз отивам да се говори малко за това, защо може да искате да използвате, за да Flask уеб приложения с Python, за разлика с някои други рамки там, като Джанго, който е най-добре познати. Подзаглавието е "и Пи- луи ", което е нещо ние ще говорим за това как да си взаимодействат с SQL бази данни. Това го прави много хубаво. Така че, тук е просто един бърз стъпки от това, което аз искам да отида. Така че, на първо място, само на един слайд че ще бъде QuickStart, което е как да получите всичко, изправи на вашия компютър. Отивам да се демонстрира този на моя местен Mac машина, Просто защото това е мястото, където съм направил това преди, аз съм най-удобно с него, но това е определено възможно на CD50 IDE. Така че, след това, искам да представим какво Flask е, и да ви убеди, защо трябва да я използват на първо място. След това, аз ще дам един бърз пример за това, което може да се направи в колба, един бърз пример от това, което можете да направите в Пи- луи, и след това аз ще ви покажа по- пълен пример за приложение че аз, взети заедно, че ние да преминете през заедно. И накрая, в последния слайд, имам някои ресурси, които ви изглеждат при повече информация онлайн. Това не е пълен урок за това как да се използва колба. И аз ще се надявам да напусне известно време за въпроси. Всеки, който гледа на местно ниво, просто като, вик в средата ако имате някакви въпроси. Така че бързото неща инсталация, ако искате да следват заедно, или ако искате да се получи това на вашия собствен машина, Отивам да се използване на Python 07.02.10. Flask върши работа с Python 3, но ми харесва използване на Python 2, защото има някои Python пакети, които не работят с 3 все още. Ако семка сте инсталирали, които е програма за управление на пакетите Python, Мисля, че ако си Python е по-голямо от или равно на 2.7.9, Имате ли вече инсталирана, това е супер лесно да инсталирате тези пакети. Можете да се пип инсталиране Колба, пипс инсталирате Пи- луи, Обикновено трябва да стартирате Sudo просто така че разрешенията да тренират. И, ако сте с помощта на супер версия на Python стари, Аз препоръчвам да актуализирате вашия Python, или използване на EasyInstall да инсталирате семка. Така че, следващият въпрос е, какво е Flask? И аз предполагам, първо разумен въпрос Чудех за дълго време е, какво е уеб приложение? Защото това е дума, която съм мислите, че е хвърлен около една партида че аз наистина не знам. И аз мисля, че най-доброто, пример за това какво уеб приложение е, Наистина е CS50 финансите, където това не е наистина само един сайт, но това е нещо, което ти можеше някак си взаимодействат с. Има потребителски акаунти и най-различни неща. Така че, къде точно рисуваш линия между това, което е уебсайт, и какво е уеб приложение, е нещо като произволно, но предполагам, че идеята, това е нещо повече от един уеб сайт и това е полезно приложение. Така че, Flask е рамка за вземане на уеб приложения, използващи Python. И да се надяваме, до края на това, аз ще ви убедя че в действителност можете да напиша нещо като CS50 финансите използване на Python, която I като много по-добре от PHP, лично. Така че, Flask е, те наричат microframework, от които, те означават, че е много проста, но разтегателна. Значи, това е точно това, което ви трябва, но ако искате повече функции, това е лесно да ги приведат инча Но само защото това е microframework, не го прави означава, че това е само за малки проекти. Имам връзка тук, който казва, че Обама използва колба през 2012 г. за предизборната си кампания сайт, който се надяваме, е нещо, на заверка. Но това, което мога Наистина харесвам Flask е, че тя всъщност не е накарала каквато и да е решения за вас. Просто, защото ние сме говорим за уеб приложения, Аз трябва да го сравни с Руби на Rails и Django, и двете от които са големи рамки, но те и двете се правят предположения за това как искате да взаимодействат с бази данни, как искате да представите възгледи, и те са определено добри аспекти на това. Например, Руби на релси има тази активна система за запис, което е много хубаво начин за взаимодействие с данни, но ако искате да използвате Руби на Rails, вие сте нещо като вързани в това. Но с колба, както аз ще ти покажа с Пи- луи, можете да използвате каквото и да подреди на база данни, която искате, и може просто да дръпнете, че в като разширение в стъкленицата. Така че това е защо аз наистина като Flask, това е, че тя не се правят предположения за вас въз основа на неща, които не се нуждаят от наистина. Така че, защо да използвате Flask? Предимствата са, че просто има наистина основните характеристики вграден в него, че имате нужда. Така че, не е нужно да се притеснявате за разбирането цял куп неща че вие ​​наистина не се нуждаят. Вие не трябва да се налага да се притеснявате за изключване на функции че вие ​​наистина не се нуждаят. И, както вече споменах, това е супер лесно да добавите в продължения на нещата че ти е нужно. Някои от тях, колбата собствената си подкрепа за него. Така че има нещо, наречено Flask администратор, който отразява, че администратор панел, който осигурява Django, която ви дава хубав визуален начин да администрира вашия сайт. Но пак, ако сте вземане на нещо по-просто, най-вероятно не е нужно голям администратор панел, така че мисля, че е супер приятно. А недостатъците са, че имате по-малко енергия от кутията. Така че, когато за първи път отвори стъкленицата, и във вашата програма Python, можете просто да напишете от Flask внос *, или каквото и да, не точно получите всички функции, които може да искате. И така трябва да имате по-ясно изброяват функциите, които искате. Така че това е един недостатък, но аз Мисля, че за изграждане на малки уеб приложения като аз ще се показва вие, това всъщност не е проблем. И това, което е последното нещо, би трябвало да се каже, което е печатна грешка, е, че има по-малко стандартизирани конвенции за това как да използвате Flask, Просто защото там не са толкова много хората, които го използват професионално в сравнение с Django. Така че, ако търсите нещо подобно, "Как мога да направя х" в Django, най-вероятно ще го намерите. Има добър дизайн модели можете да използвате, но с колба, това е нещо като отидете свой собствен начин, Просто защото това е доста малка библиотека. Така че тези, които са най- недостатъци, но аз мисля, че тя все още е добра библиотека, за да използвате. Така че нека просто скочи право в стъкленицата. Това определено не става да бъде пълен урок, но това е, за да ви дам една идея за това как да се структурира нещата, и така да се чувствате комфортно ще изключване и погледнете в документацията и да научите повече. Така че, нека да отворим една наистина прост пример на първо, а ти какво, които показват, Изглежда, и след това ще го съборят малко повече. Така че това тук, нека да го използвате. Така че, аз сега имам молба ми вървят. Отивам да се отворят Safari, и той се движи на моя местен домакин. Така че аз съм просто ще направи тази голяма. Но Localhost: 5000 И така, точно сега, всичко това прави е, когато посещавате уебсайта, той отпечатва "Hello Flask" който не е супер полезно, но мисля, че това е готино, че в този малък файл тук, имаме уеб сървър бягане че отпечатва нещо. Така че, нека да погледнем реално в кода за секунда, и да го съборят малко. Дали размера добро за всички тук? Така че, да се надяваме, че си малко по- удобно използване на Python. Аз съм се предположи, че ние можем да погледнем питона и прочетете през него. Ако имате някакви въпроси относно нищо, аз също може да разясни, че. Така че първата ви линия е, от стъкленицата, внасяме, Flask с капитал "F" което е нещо на всички ключови функции, които имате нужда. Всеки път, когато пишеш файл и при използване на стъкленицата, започваш да искате да импортирате, че, Просто защото това разполага с всички основни неща. Следващото нещо, което правим, е, че ние наричаме тази функция Flask, просто да се създаде приложение, обект, а ти си винаги ще искате да направите това. И тогава, скачайки надолу до отдолу-бързо, тази част тук е, "if_name _ ==" _ main_ "", която е сортиране на спогодба за избягване на Python. Така че това ще се изпълни само ако сте тече този файл директно с помощта на Python. След това, което наричаме app.run, които ще същинското започване на приложението става. Така че, това е основната структура, която ще имате във всяко приложение на стъкленицата, е ще имате тази ап = Flask (_NAME_), а след това app.run. Така че, двете неща, които имам тук, са това, което ние наричаме маршрути. Така че, нека да поговорим за маршрутизиране на малко повече. Аз ще се върна в слайда. Така че най-основното концепция в стъкленицата е маршрутизиране. И това е идеята, че присвоява функции в Python за определени адреси на вашата уеб страница. Така че, когато пожелаете да се създаде нов маршрут, използвате този @ app.route функция декоратор. Така че, ако не сте запознати с функционални декоратори в Python, това е, че тази концепция Позволява ви да си функция и го обграждат с нещо друго. Така че наистина, какво е това декоратор прави, е, че отнема функцията под него, и това добавя още информация към нея, но какво всъщност Flask няма да се случи, не е супер от решаващо значение, но това, което е важно, е, че преди маршрута, ви постави този @ app.route, и след това адреса на маршрута, така наклонената черта е, което ние видях, когато ние просто отваряне на уеб страница. Така че това е началната страница. Това е просто по маршрута наклонена черта. И тогава ще има тази функция. Името на функцията може да бъде каквото си искате. То не трябва да е задължително трябва да се направи с по маршрута. И тогава, каквото и възвръщаемост на функцията му, функцията трябва да се върне низ. И това може да низ съдържа HTML или нещо подобно, и това е всъщност това, което ще получите се върна към вашия уеб браузър като HTML, и тя ще направи това. Така че това е един и същ код че е от примера че аз просто избяга, така че, когато посещаваме наклонена черта, го нарича Hello World функция, която просто връща низ, Hello Flask, и че получава отпечатан върху екрана. Така че има още един пример, което е, когато посещавате / здравей, той отпечатва Hello Word, която всъщност трябва да се каже, Hello World, но нека да се преструвам, че е умишлено. Така че нека да дръпне, че до бързо. Така че, ако отидете на Localhost / здравей, сега ще отпечата нещо друго. Така че това е само един бърз пример за това как можете да създадете два различни пътя. Така че, доколкото това не е супер полезно, там не е цяло много можете да направите, можеш да направиш всичко, което с с различни HTML страници, и когато посетите даден страница тя просто зарежда страницата. Така че нека да видим някои по- полезни неща, които можете да направите. Така че, едно нещо, което може да се наложи Забелязах, в примера, че извадих нагоре, е, че бях app.run (дебъгване = True). И така, какво е това аргумент за отстраняване на грешки прави, е че когато тичам вашия уеб сървър, когато сте в молбата Ви, ако промените даден файл, той ще автоматично презареждане на сървъра. И така, вие всъщност не трябва да рестартиране Python, което е супер полезно. Мога да покажа, че. Позволете ми да спра моя код с печатна грешка в него, и да се преструвам, че печатна грешка бе сложил там преднамерено за поучителни цели. Така че нека да добавите този обратно. Така че сега се казва Hello World. Аз ще го спаси. И ако ние се изтеглят нагоре терминала, ще се каже, че това е рестартиране, защото тя открита промяна, и така сега, когато ние презаредете страницата, тя ще разпечатате правилното нещо. Така че за отстраняване на грешки е супер полезно за това. Също така, ако имате някакво сортиране на катастрофа, така че позволете ми да направя този забиването на програмата от като той не се върне низ. Така че, нека просто го има върнете Няма по някаква причина. И тогава, когато посетите този страница, той просто ще се срине, но сървърът не просто се срине, то всъщност дава супер полезно обратно следа от всичко, което се е объркало. И това, което е наистина хубаво, е, че по всяко стъпка в тази върна следа, бихте могли да се отворят интерактивен плащам тук, и нещо като отпечатате това, което променливи, които искате да погледнете на адрес. И така, отстраняване на грешки е наистина полезно за фигуриращ какво се случва с вашия сървър, а не просто виждам нещо в PHP като 500 вътрешна грешка на сървъра, което е супер безполезен. Едно нещо, което да е наясно, е че ако сложиш приложението си онлайн така че това е видимо за обществеността, вие Никога не му попречи да продължи отстраняване на грешки режим на, защото хората действително могат да използвате тази конзола, че аз показа можете да изпълни произволен код. Така те могат да разпечатате като всеки секретни кодове, които имате там, те могат да разгледаме точно как вашия сайт работи. Така че това е наистина полезно за тестване, но винаги уверете се, да го извади преди публикувате нещо онлайн. Така че, когато използвате нещо като PHP, има тази идея че може да премине информация между уеб страници чрез поставяне на информацията, която реално в URL адреса, който е заявка за GET, но в колба, всъщност можете да направя нещо нещо подобно, от наличието на маршрут, който има променлива, като част от нея. Така че, ако се вгледате в тази Например на екрана тук, имаме маршрут, който е ('/' Здравей '/'), и така, ако посетите / здравей / нещо, че нещо ще се получи в действителност с пълнеж в променливата име. И забележете, че функцията който идва с този маршрут трябва да се вземе в параметъра име, така че тя действително ще се премина в функцията. И тогава, след като сте вътрешността на тази функция, можете да лекуват, че като нормално Python променлива, и така след това, тя ще разпечатате Здравейте, и го ще попълни името с помощта на форматиране низ. Така че, за да добавите променливите части на маршрутизация, използвате скобата ъгъл маркировка. И по избор, можете да използвате което се нарича конвертор. И така, ако поставите този Анотация с дебелото черво, можете да се уточни, че това е пад, или поплавък, или път, и тя автоматично ще я превърне в това. Можете също така да направи превръщане в рамките на функцията Python, само с помощта на един глас, но понякога, ако искате да се гарантира, че това е едно цяло число, можете да сложите, че правило преобразуване там. Така че нека да спра пример на някои променливи правила. Така че тук, това е същото основния структура с внос от Flask Колба, ап = Flask (_NAME_), и след това той се движи в края. Ние имаме тези две различни променливи маршрути тук. И първия, е този, който показах в плъзгача, която е, че тя просто отнема в името на низ и тя ще разпечатате Здравейте, Name. И след това, а вторият човек използва преобразуването. Така че това автоматично ще го превърне да пад, а след това удвои ср, и печат, че навън. И ние не правим всякакъв вид на превръщане в нея защото Flask се грижи за това. Така че нека да получите това бягане. Когато имате Flask приложение, което работи, Можете да контролирате-C от него за да спрете сървъра протичане. И тогава аз ще се проведе на променливите. Така че нека да отидете на Localhost / здравей / Езра и да се надяваме, че това ще кажа здрасти за мен. Така че го взе в Мое име, в променливата маршрут, и да го напълни я от тук. Така че аз също ще покажем бърз Пример за удвояване. Така че, ако отидете в / двойна / 3, тя ще разпечатате 6. Така че това се грижеше за преобразуването за нас. Така че можете да го направите с плувка, и нещо по-специално, ако трябва да се уточни нещо подобно пътека, която ви позволява да го приемам наклонени черти, но това обикновено не трябва да бъде проблем. Досега сме, все още имат току-що беше връщане струни, което не е много интересно. Ние в действителност може да се върне буквалния HTML низ. Така че в кода можем да вмъкнете нещо като б-таг, за да го смели, но повечето от вас време всъщност не искат да бъде писмено HTML код в Python код. Той получава много надраскан, и това не е добро време. Flask ни позволява да се отделят от HTML в това, което се нарича шаблон, и така, ако си мислиш от гледна точка на модела MVC че сте запознат с, надявам се, да работят с CS50 Finance малко, можеш да се сетиш Python файлове като повече от контролиращия орган, когато те взаимодействат с каквото модел на данните може да се наложи. И тогава те се вика да Прегледи и предоставянето на информация на които View за попълване на информацията в HTML, че тя се нуждае. И това, което ние наричаме тези Прегледи са Templates в клас. Така Flask използва друг Python модул, който тя автоматично ще инсталиране, когато инсталирате PIP Flask нарича Джинджа, които ви позволява да добавите тези анотации към HTML който виждате на екрана, която позволява на ще ви постави в неща като условни, и примки в HTML. Така изглежда малко като как си може да използва PHP в рамките на един HTML файл, но това е само, когато се колбата сървър служи на HTML файл, тя ще върви този темплейт двигателя и разбор през тази и попълнете неща вътре. Така Flask има функция render_template които можете да видите в долната тук. И така, когато посещавате тази страница, то биха направили тази hello.html Template, и след това попълнете тази HTML страница. Така че нека просто стартирате тази реална бързо, и да видим как изглежда, и после ще премине през малко по-подробно. Така че, вашите шаблони вървят да отидете в папката на шаблони. Тя автоматично ще изглежда в рамките на Папката Templates за този шаблон. Така че нека да отворите този нагоре. Така че, аз ще тичам примера темплейт. Така че, ако отида да / здравей / Езра, тя има тази ужасна, противни бягащ маркер, че сложих вътре. Много хубаво, много динамична. Аз съм голям фен. Но какво се случва, ако Просто отидете, / 'Здравей'? Така че той просто казва Hello World. Не го преотстъпвайте на име, и той го попълва автоматично. Така че нека да видим как го е направил, че и как ние можем да се отървем от които може би палатка. Така че тук, това е нещо като интересен пример, ако сте запознати с това как превключвател изявления работят на език. Кажете това е нещо като, този вид спад през, където всъщност прикрепени две различни маршрути до една и съща функция. Така че ние придаваме на / здравей маршрута и на / здравей / име маршрута до Hello, и ние зададени using-- Python ви позволява зададени по подразбиране функция arguments-- така че, ако не е име, така че ако отидем до малко / здравей, той автоматично ще филтрира да име се равнява на None. И така, ние положили Template с име = име, така че ще премине в параметъра име равно на това име функция параметър, в шаблон. Това все още не обяснява как е вземане на решение дали да отпечатате Hello World, или отпечатате името ми. Така че нека да погледнем реално в самия шаблон, и да видим къде, че идва от. Така че, в рамките на този шаблон, ние действително има някаква условна логика, които някои хора биха твърдят, която действително не трябва да има много условно логика в рамките на вашата самия шаблон. Тя трябва да бъде в рамките на по- Controller, но за този пример това е нещо доста малка. Така че тук, ние проверяваме, ако името, така че ако името не е равно на None, ако едно име е всъщност преминали в, тогава ние ще кажа Здравейте, името с на глава и шатрата, всичко това нормално HTML, в противен случай, ние ще разпечатате Hello, World просто нормално. Така че няколко неща, за да забележат тук за това как можете да форматирате шаблони, е, че всички тези условни конструкции, нещо като как го когато PHP искате да вмъкнете някои PHP, използвате по-малки от въпросната марка, това е нещо като аналогична тук с {%. Така че тук, ние имаме условно код. И тогава, когато всъщност искаш да буквално се оцени нещо, и печат то вън до екрана, вие използвате двойни скоби. Така че тук са двойни скоби, и тогава ние посочите име, така в рамките на това, тя ще оцени името на променливата, които е приет през от направи шаблонна функция, а не само печат вън, ако сме се отървали от тях, тя просто ще отпечата думата "наименование". Така че, това е нещо, което да внимавате. Така че друго е да бележка е, че, когато ние искате да използвате render_template функция, ние всъщност трябва да внасяме тя изрично от стъкленицата. Това е пример на модулността на стъкленицата, че не трябва да внасяме неща, които не ви трябват. Можете просто да донесе в функции всъщност лесно, което понякога е хубаво, така че да не правим Трябва да имаш всички тези функции около заседание, че не използвате, но също така, ако сте забравили, че сте Трябва да внеса render_template, най-вероятно ще получите предупреждение която ще ви позволи да знаете за това. Така че, това е темплейт. Така че, ние показахме как да правят прости уеб страници, и се добавя малко повече логика да това, по отношение на променливата маршрута. Тя ви позволява да правите различни неща въз основа на какво URL отидете, а също и след това, да даде на HTML малко повече разум в от гледна точка на това как искате да направят нещата. Вие не трябва да се постави цялата Вашата HTML във вашия Python, но за доста много всеки уеб приложение, започваш да искаш някакъв вид на модел на данните, свързани с него. И така, по традиция, това би да бъде нещо като SQL база данни. А може просто да си взаимодействат директно с SQL. Python е, мисля, че тя се нарича. SQLite 3. Можете просто да импортирате SQLite 3 и изпълняват SQL заявки директно, но аз не знам за вас, но аз наистина не ми харесва, просто, оформяне на SQL заявки. Тя има тенденция да получите наистина дълъг и сложен. И така, нещо, което Обичам да използвам е това, което е известен като ORM, което е обектно-релационни картографиране. И точката на обектно-релационни картографиране, е, че има две различни начини, можете да мислят за бази данни. Така че примерът Професор Malan обикновено използва в клас, е таблица Excel, където имате тези редове и тези колони, и това е наистина полезно за как тя е представена в SQL и как можете да си взаимодействат с него, но друг начин, че това е всъщност полезно да се мисли за това, понякога, е по отношение на класове и обекти. Така че, вместо на мислене на всяка маса като имащи този ред, че има определен информация, можете да всъщност мисля за него като всяка таблица е един клас, и след това на всеки съд на клас има определени свойства. Така че, в този пример, случаите на класа са редовете в таблицата, и след това всеки имот ще бъде колона в таблицата. Така че, ORM, че ми харесва да се използва, се нарича Пи- луи. Това наистина е много малка, нещо като колба. Мисля, че те вървят добре заедно, но има и много други ORMs които можете да използвате. А по-популярна от тях е известен като SQLAlchemy, и аз не мога да си спомня защо аз първоначално избра Пи- луи над SQLAlchemy, или аз ще ви кажа защо съм Мисля, че е най-добрата, но ние просто ще използвате този един, защото знам как да го използвам. Така че, един въпрос е, защо трябва да ви притеснява с помощта на ORM, вместо просто директно написването на SQL заявки? И мисля, че най-добрия случай, е, че вие ​​всъщност не трябва да напишете SQL запитвания. Това е много по-лесно, тъй като аз ще ви покажа, за да направя неща, като селекция, вмъкване, заличаване, особено създаването на таблици. Това е много по-лесно да се напиши структура клас, отколкото да се структурира Създаване Декларация на маса, но едно нещо да е наясно, че е на ORM ще направи всичко възможно, да разбера какво най-много ефективно SQL заявка ще бъде, но понякога тя получава я обърка. И особено ако сте работи с голяма база данни, можете да забележите, че заявката че трябва да се работи бързо, всъщност се отнема по-дълго. И ако се вгледате под капака как на ORM е тълкуването, че в SQL, това може да се прави нещо наистина нелепо, само защото нещо посочи намеренията ви обърка. И, че е имало времена, когато Аз съм имал да го замени, и просто изпълнява собствените ми SQL заявки, просто защото тя е разбор по странен начин. Така че, има някои режийни, точно по начина, че той съставя си изявления надолу в SQL. Така че, нека да разгледаме супер бързо при един прост пример за модел на данните които можете да използвате. Така че, това е кода на Питон, и така Първото нещо, което искате да направите, е от Пи- луи внос *. Така че, за разлика от стъкленицата, където трябва всички тези отделни модули, и искате да импортирате Flask, и напиши Template, и някои други че ние ще видим по-късно, от Пи- луи, може просто да импортирате всичко, защото това е доста малка библиотека. Така че, първото нещо, което искате да направите, е всъщност създаде тази база данни обект. Така че, имате db = SqliteDatabase, и след това името на вашата база данни. И това действително ще създадете обект на базата данни че можете да си взаимодействат с, с Пи- луи. И след това, ние имаме реалното модел, който искаме да създадем. Така масата искаме да създадем. Така че, в рамките на Пи- луи, всеки клас има своя собствена маса в рамките на вашата база данни. Така, всички класове наследяват от базовия модел, и модела на капитала M е нещо, което е дефинирано в Пи- луи. Така че, всички ваши модели следва наследи като най-високото си суперкласа, те трябва да наследи от модел, но това, което е наистина страхотно, е, че всъщност можете да имате своя модели наследяват един от друг. И много от времето, си модели на данни не непременно направи хубав йерархия наследство, но пъти, когато го правят, това е много хубаво, защото имате модела присъщ един от друг. Така че, ние определено този клас "студент", който наследява модел, и тя има три имота. Той разполага с ID, което е а PrimaryKeyField, които е нещо, което е предвидено от Пи- луи, името е CharField, и клас е IntegerField. Така че това може или не може да бъде как CS50 всъщност съхранява всички степени на студентите. Това не е, но това е начинът, аз ще го направя. И след това го има, в рамките на този клас, а това е нещо, което можете да правите с Python, че може да има вложени класове. И това е нещо, това е необходимо, от Пи- луи. Така че, този клас Meta, имате да се уточни, че базата данни е равна на обекта че ние създадохме по-горе. И това казва какво файл е тази таблица всъщност ще трябва да се съдържа вътре. Така че това е нещо, което трябва да имате да се направи в рамките на всичките си модели. Просто трябва да се уточни в рамките на този Meta клас тази база данни е равна на db. Така че това, което обикновено правя, ако имам куп различни модели, е, че имам една база модел, че аз обикновено просто се обадете "базов модел" че има Мета класа, и тя определя на базата данни, равна на db. И тогава всички следващи мои модели ще наследи от този базов клас. И тогава аз не трябва да се притеснявате за определяне на Meta клас. Така че, когато това всъщност получава съставила надолу в изявление SQL, тя изглежда така гадно нещо надолу тук, "Създаване на маса студент ID число, " както и да е. И аз мисля, че той е по-кратък, този SQL заявка тук, но ако се вгледате в този клас тук можете да видите точно това, което се случва. Можете да видите какви видове полета съществуват, което те се наричат, и така, аз мисля, че погледнете в този Python код е много по-неразбираем от опитвайки се да напиша тази SQL заявка. Така че, за да всъщност използване на данни, ние трябва да се свърже с него в рамките на Python. Така че, аз обикновено напише функция, наречена initialize_db че прави две неща. Това отнема в базата данни обект db и да го се свързва с него, което точно се отваря до точка до базата данни. Ако сте само тичане макар уебсайт на локалния ви машина, това не е супер голяма работа да се притеснявате за свързване и изключване, но ако използвате то на уебсайт, можете искате да се уверите, че всеки път, когато даден потребител се свързва с него, когато те закриват уебсайта, те изключете, така че да не разполагат с един куп хора, свързани до вашата база данни всички наведнъж. И тогава, когато свърже с базата данни, искате да се обадите db.create_tables, и списък на моделите, за това, което искате да се създаде масите. Така че тук, аз просто искам да той създаде за този ученик. И след това, което е важно, е да се зададени безопасна = True най-времето. Така че това, което това твърдение ще направя, е, че тя създава таблици за Студент модел, но само ако тази таблица не е вече са създадени. Това е, което най-безопасни уточнява. Така че това не ще презапише съществуващия си маса, това само ще създаде нов маса, ако има не един там. Така че, просто можете да създадете таблиците веднъж, използващи SQL. И след това има, че заседание на база данни там, и след това се свържете с всеки път, но това е обикновено приятно просто да сложи в тази create_tables повикване, така че, ако някога изтриете база данни, когато стартирате вашия уеб отново ап, ще го пресъздаде. Така че, просто се уверете, че безопасната е определен, за да е истина, или ще намерите вашите данни само Първи clobbered всеки път. И след това, можете да просто се обадете initialize_db да се установи на връзка, и да се създаде маси ако е необходимо. Така че, най-често нещо че вие ​​ще искате да направите, или на един от най-честите неща, е действително да поставите нещата във вашата база данни. И така, вместо да се налага да напише вмъкнете в декларация с всички посочени стойностите, всъщност можете да се обадите функция на класа ученик. Така че, когато създавате клас които наследява от модела, тя има това създаде метод. Така че, вие правите клас name.create, и укажете параметрите който искате да мине инча Така че, ако искате да добавите някои ученици в нашия CS50 клас книга например, Ще сложа в Давид, който има много добра оценка, той има 95. И аз, който не се справя толкова добре в CS50, имам 50. И така, хубавото какво е това създаде функция прави, е, че той се връща на място, или ред, който го е създал в таблицата, и така след това да съхранявате, че в променлива, както и работата с него по-късно. Можете да промените наоколо, които Ще покажем пример. Забележете, че не го направих трябва да посочите ID, защото, тъй като тя е най- PrimaryKeyField, той автоматично ще увеличи го, ако не го посочва. И, всъщност, най-вероятно Не трябва да го посочите, защото може случайно смажат ID на някой друг. И вие искате да се сигурни, че това е уникален. Така че, всъщност, най-много обща нещо, което искате да направите, вероятно е да изберете от на базата данни, след като има много информация там. И така, ако искате да получите всичко, така равностойността на звездата изберете от учениците изявление, то Просто би било student.select. И това ще ви даде обратно масив с всички студентът обекти в нея че сте обхождане искате. Можете да получите неща от него. И през повечето време, вие не просто искам да направя избор, всъщност искате да уточни нещо. И така, можете верига заедно тези извиквания на функции, като как бихте верига заедно твърденията в SQL. Така че можете да направите student.select (). Където В този пример. И след това, можете да уточнят условията, само с помощта нормално Python Булев тип, за да проверите неща. Така че, в този случай, вие искате да ограничи това, което сте избрали да, където student.grade е равно на 50, и student.name е равна на Ездра, така че просто ще ми се измъкнем от него. И забележи, един наистина коварен нещо тук е, че, ако искате да зададете на и / или или и / или, в Python, които обикновено се използва, Мисля, че думата "и" всъщност, но тук можете да използвате единичен амперсанд, който е по принцип оператор побитова, но в този специален случай, просто начина, по който го прави Пи- луи, използвате сингъл амперсанд да уточни "и." Това е нещо, което Аз се забърка много, но тя не излезе че много в практиката. И тогава, след като имате всички студентите от базата данни, След като сте направили сте изберете и си износване или каквото и да, можете да използвате foreach цикъл, точно като нормална в Python, с каквато и да е итератор или с каквато и да е масив. Така че можете да направите, за ите в student.select (). WHE повторна (Student.grade <75), и така тази воля обхождане на всеки ученик в таблицата чиято степен е по-малко от 75, което в този случай, е все още само на мен. И тогава може да се направи нещо в рамките на че контур, като ми изпратите имейл и аз да кажа всъщност превърне в мой проблем Комплекти. Така че, още нещо, можете да направя, е, че е много лесно за актуализиране на редове в таблицата. Така че, не забравяйте отново тук, си, когато съм поставена, Взех със стойността, която беше върнати от student.create, и аз го определя на име нарича Езра. И така, сега, можете да промените стойности в рамките на тази инстанция, точно както бихте го направили с нормалната клас в Python. Така че можете да настроите ezra.grade = 95 и че ще се актуализира на локалното копие, но ако наистина искате да ангажират с тази промяна в базата данни, ще трябва да се обадя ezra.save, така че можете нарича .save метода на инстанция. И така, сега, аз успешно са се променили собствената ми клас в базата данни. Така че, нека да кажем, че ме хванат променящата ми клас в базата данни. Професор Malan вероятно ще да искат да ме изтриете от този клас, и за да можете да се обадите на .delete метод например само върху това нещо. Така че, ако искате да отидете обратно в този цикъл тук, и всъщност, вместо на изпращане на имейли всички на студентите, чиито клас е по-малко от 75, което исках да ги изтриете, в рамките на този цикъл можехте обадете s.delete инстанция. И последното нещо, което искате да направите, е всеки път, когато се установи връзка, и сте готови с вашата работа, искате да се обадите db.close, където db е, че базата данни възрази, че сме имали преди. И вие искате да се уверите, че всичко получава затворен от. Готино. Така че сега, имам пример за приложение. Аз съм нещо като предварително направена просто всичко така че няма да има всяко живо кодиране грешки, но ние можем да преминете през то и да видим как ще се сложи Flask и Пи- луи заедно, и направи проста ап. Аз го наричам CS50 тирада, и това е вид на обикновен блог платформа. Така че, на първо място, аз ще го изпълним и покажа как изглежда, и след това ние можем да погледнем по-в кода. Добре, така че нека просто стартирате тази. Cool, аз ще направя това малко по-малък. Това не е много хубава, само защото Аз не направи много CSS, но това, което той прави, е, че има тази база данни на блог постове, и преминава през цялата тях, и той ще ги покажете на страницата, за на най-новото. И така, това са само някои мнения че съм спасил в базата данни. Така че, ако искаме да се създаде нова пощата, можем да отидем да се добави нова публикация, и ние можем да въведете заглавието на пост, така че нещо подобно, CS50 семинар. Уау, наистина се радва на семинара. Готино. След това натиснете пост, и това ще стане ви пренасочи обратно към началната страница, и след това ще видите, че е добавен последните мнения. И ние все още имаме всички онези там. Така че сега, нека да се оттегли през всички код и да видим как това се реализира. Така че, мисля, че първото нещо, което нека да разгледаме, е всъщност моделите. Много от времето, когато сте проектиране нещо, искате да се мисли първо за това, как започваш да представлява вашите данни, и след това да се изработи нещата около които, така че всичко има смисъл. И това е всъщност как съм го направи, когато правех това, Аз седнах и си помислих, какво искам в пост. Така че, тук, ние имаме една и съща структура че аз се споменава по-рано, когато правим db = Sqldatabase ("posts.db"). В действителност, най-вероятно не искат да твърди код в базите данни на вашия име. Това вероятно би трябвало да е параметър които се съхранява някъде, може би в конфигурационния файл, но в един малък пример, подобен на този, че е добре да се твърди, че код инча Така че сега, ние имаме този клас Post, която наследява от базовия модел. И това е, отново, за ID = PrimaryKeyField. Всъщност, ако не укажете, ако аз действително се отървах от този, След Пи- луи ние ще се погрижим за автоматично създаване на тази област ID, и това ще стане автоматично го направи PrimaryKey, които Мисля, че е много хубаво, защото обикновено, това е нещо, което искате да имате, но ми харесва да го сложи в специално, Просто така си спомням, че тя е там. Но ако не се уточни, че, че ще има автоматично. И така, аз имам дата, която е DateTimeField и всичко тези различни области, ако погледнете на Пи- луи документация, тя ще ви даде списък на различни видове полета, които можете да използвате. В по-голямата си част, това е аналогична на това, което ще видите в SQL. Така че има CharField, а VarCharFields, TextFields, които са за много дълго текстове, като блог пост потенциално, DateTimeFields, DoubleFields, FloatFields, всички такива неща. И вие може да премине в други аргументи към него, което аз не уточни тук. Кажи, например, можете не му попречи да позволи две длъжности да имат същото заглавие, можете да укажете нещо като уникален = True, и това е само допълнително параметър, за да областта, че когато става той съставя надолу в SQL, това ще се уточни че тя трябва да бъде уникален. Можете също да укажете нещо подобно Не нищожна и всички други неща, обикновено правя в SQL. Така че, това е доста проста модел, който има дата. Забележете, тук, в рамките на DateTimeField, Аз определено това, което е по подразбиране. Аз го определен, за да бъде datetime.datetime.now, заради начина, по който това стане оценена, тя всъщност оценява на datetime.now когато тя се вкарва в базата данни. Мисля, че щях да имам да се удвои проверите това, но ако си направил нещо подобно, тогава тя всъщност ще оцени, че веднъж, и след това на дата и час винаги ще бъде един и същ. Така че, просто, ако правиш нещо с datetimes, двойна проверка че това е оценката, когато действително да бъде внесен, или пък може да бъде объркан. Заглавието е просто CharField, която има са повече аргументи можете да минат в уточнява точно колко дълго искам тя да бъде, но ето, тя наистина не е от значение. И Текст ще бъде текста на целия пост, и че ще е по- TextField само защото искате за да може да бъде доста дълъг низ. Тогава ние имаме тази Meta подклас, че просто уточнява, че искаме базата данни когато това е всъщност отвори в да бъде най-db обекта, които имаме тук. И последно нещо, ние имаме тук, е само тази функция че ние ще използвате от основната ни ап за инициализиране на базата данни, за да се свържете с го, и след това да създадете таблицата Post. Сега, нека да разгледаме самата основна ап. Така че това е доста малко по-дълго от тези, че сме виждали и преди, но се надявам да не е твърде лошо. Така че, нека да удължи този навън. Добре. Така че, забележете, и горната I внесени цял куп други неща от стъкленицата, че ние не трябва наистина е виждал преди. И да се надяваме, ние може да мине през всеки един от тях един по един и говори малко повече за тях, сортирани по пример. Така че, ние имаме колбата, и render_template, което сме виждали преди, това искане обект, който ще излезе когато погледнем как вида, в който бях показва всъщност върши работа. Пренасочване, която ви позволява да пренасочите обратно от Създаване на нов пост Обратно към началната страница на оригиналния, а след това URL, който е нещо, което ви позволява да разбера къде в уебсайт на определена страница е. И така, следващият нещо, което правя, е I внос цялата информация, от Models файлове, които ние просто гледат. А, да. Така че, нещо друго ново, което идва когато имаш работа с, особено бази данни, е, че можете да укажете функция, която получава, наречен преди всяко искане и функция, която получава извика след всяко искане, като се използва този запитване функция декоратор app.before. И така, това ще се изпълни където и тази функция е. Това не трябва да бъде извикана преди поискване но обикновено това е нещо, разумно да го наричат. Можете да посочите каквото и функция искате да се нарича там, така че аз определено това initialize_db функция, която имахме още през Models файл, така че преди всяка заявка, искате да се свържете с базата данни. Има два различни начини, можете да направите това. Можете да направитеapp., Т.е. вярвам, че е after_request. И разликата между after_request и teardown_request, е, че ще се случи само after_request ако искането всъщност е бил валиден. И така, само ако искане е било успешно, ако нищо не се обърка, но teardown_request случва в случай на успех молба, или в случай на грешка. Така че, обикновено, което искате да използват teardown_request, освен ако не искате да направите, нещо, особено различен в случай на грешка. Но само за затваряне на базата данни, дали тя е загубила или ако не може, правим искате да прекъснете от базата данни. Така тя се нарича, db.close на DB обект. Забележете, че teardown_request отнема по изключение. Така че можете да проверите дали има действително грешка, когато е било закриване, но тук, да се надяваме, че Не са един куп грешки, така че ние сме просто някак без да обръща внимание, че. Добре, а останалата част от него не е твърде лошо. Така че, когато отидем в началната страница, ние постановено това home.html Template че ще се отвори. Пропускът е в пост равно на, и какво е това прави се, не забравяйте, ние имаме този пост модел, така че ние подбираме всички постове, и след това друго нещо, което можете да направите, можете да укажете клаузата WHERE, можете да укажете поръчате по, и така ние приемаме всички от постовете, които получите избран и след това ние ги поръчате от post.date.descending. И това ще се уточни, когато те всъщност излезе, най-скорошната ще бъде много първата една. И след това, ние минаваме, че в шаблона за home.html, така че нека действително се отворят че Template наистина бързо, и да разгледаме как това е работа. И това не е голяма HTML, но надявам се, можем да се съсредоточим върху Питон. Така че има линк към Добавяне на нов Post, и така това се уточнява маршрута в колба, че дефинира, която е точно тук. Това е нов пост маршрута, и ние се уточни, че тук. И така, това е линк тогава, че ще отида до този маршрут в рамките на сървъра на стъкленицата. По-интересното е това за цикъл тук. Така че ние се уточни, че този след параметър, който е приет в render_template функция, за всеки пост в пост-те обект, който да се изпраща инча Искаме да разпечатате заглавието на съобщението, в H1, и след това по-долу, ние искаме да разпечатате текста пост в рамките на една точка. И тук, можем действително наричаме функция Python, така че можем да наречем диалоговия прозорец за грешките, ST-RF-време, и може да премине в низ за форматиране които искате да отпечатате данните на инч Така че това е доста хубаво, че можете да всъщност наричаме тази функция Python отвътре тук. Не е нужно да правите форматирането на страна на контролера, защото наистина, форматиране на датата е нещо, което искате да се справят в рамките на изгледа. И всички те процента нещата не са супер важни. Ако погледнете нагоре документацията за функцията на диалоговия прозорец за грешките в Python, тя определя всички тези неща, но това е как, когато ние търсехме в началната страница тук, го форматира това с хубав дата, и в него се посочва AM или PM, но обикновено, ако ние не са имали този тук, най-вероятно ще получите някои боклук дата, че не изглежда много добре. И тогава ние се уточни post.text, и можех да изведе няколко редове тук, просто да се въведе някакъв пространства между всеки пост. Така че, мисля, че най-важното нещо в този пример, е, че можете да използвате това, за контур. Това е аналогично на неща, които можете да направите в PHP. Можете да превъртите през, всичко да се изпраща в, и така, вместо да се налага да се направи Copy / Paste, Copy / Paste всички HTML, просто трябва да го пиша веднъж, а след това можете да обхождане на всички публикации. И това е нещо, обща, която искате да направите, когато имате много данни, е, че за всичко в данните си, искаш да направиш подобно нещо. И след това, просто не забравяйте, че когато искате да отпечатате нещо изрично в HTML кода, който използвате двойните скоби тук, но тогава, когато искате да зададете някаква информация за състоянието, или около една за контур, вие използвате процента скоба. Така че, да се върне в Python код, така че обяснява какво се случва в по-голямата маршрут, когато отидем там, той просто показва всички мнения, но тогава въпросът е, как да се получи в действителност мнения в базата данни, която е малко по-интересно. Така че, когато кликнете върху новите Post връзка, което видяхме тук, той ви пренасочва към тази форма. И това е само един прост разговор към render_template функция, която след това преминава в новия пост в HTML форма. Така че нека да погледнем на това. Така че това е доста проста. Той има прост HTML форма, която ще изглежда малко по-запознати, въз основа на формулярите в CS50 Finance. И така, ние зададени тук, действието. И тук, ако работите с PHP, обикновено тя, ще бъде нещо като, create.PHP, но тук ние всъщност посочите маршрут в сървъра колба. И така, този маршрут съответства за маршрута създаде които имаме тук, които ние ще отидем в в секунда. И така, ние се уточни, че това е метод пост, защото искаме да изпратим тази форма на данни, и обикновено когато сте изпращане на данни от формуляр, може да искате да използвате искане пост, Просто, за да не се окажете с този голям, тромав URL. Но можете също да използвате заявка за GET, и да ги прекара с променлива маршрутизация, но за форми, това е хубаво на искане пост тук. И така, след това, просто ви харесва ще правим с HTML и PHP, можете да зададете тези текстови входове, и можете да укажете името на тях, и това е името, с което ще се предава в искането обекта в рамките на стъкленицата. И тогава ние сме една Подайте бутон, който казва Post. И тук, Post е името на бутон, защото това е един блог пост, но тук, пост е метод на избор. Така че тези, които са на една и съща дума но всъщност не са свързани. Да Ако се върнем към кода на Python, когато ние нарича метод за създаване, забележите, че тук можете да всъщност зададени в рамките на маршрута методите за заявка който искате да приемете, и така тук, аз се уточни, че I Само искам да приемам метод Post. Така че, ако аз всъщност се опита да посети страницата пряко, което е с помощта на заявка за GET, тя ще ми каже "Метод не е позволено." И така, вие имате страници, нещо като това създаде страница, която аз съм само Наистина се използва като начин за формата да се подава, можете да укажете, че не правим искам хората да бъдат в състояние да отида там директно чрез заявка за GET, или ако не сте искали, по някаква причина, искане Post, бихте могли само да уточним стигна до тук, но в този пример, ние просто Искам искане Post да изляза. Така че, когато create_post се нарича, когато посещаваме, че чрез искане Post, всеки път, когато отидете на конкретна маршрут, има това искане обект, и ние трябваше да импортирате исканията на самия връх, но има това искане обект, който да се изпраща в, и можете да получите достъп до данните от формуляра, което автоматично ще се напълни когато изпращате искане от форма. И след това, което мисля, че е наистина страхотно, е тази форма на обекта, за да се пропуска в, е само на речника Python, че съдържа, ако access-- така че тук, нека ме спра на HTML в непосредствена близост до него, просто така че може да има, че като отправна точка, да, така имената, които сме тук, за да определят за различните области, така че заглавието и текста, ние тогава просто използвайте такива, които тук като индекси в данните от формуляра. Така че, това е супер удобно. Така че след това, което наричаме post.create, които ще създаде и автоматично вмъкнете този нов пост обект в базата данни. И аз мисля, че това създаде функция тук е наистина страхотен пример за това как мощна Flask е и работата с този, защото, ако бяха прави нещо в PHP, може да се наложи да направи много за валидиране, вие ще трябва да след това създаване на база данни, връзка, вие ще трябва да след това изпълни заявката за SQL, но тук ние просто трябва тази хубава post.create, което можем, тогава просто получите информацията, посочени на искане обекта, и след това да го предаде в нова публикувате, че ние създаваме. И тогава, съвсем последното нещо, което искаме да направим, е да се пренасочи потребителското обратно към дома. И така, ние използваме тази Flask пренасочват функция. И нещо, което не бях виждал преди, беше този URL функция. Така че URL адреса за функция позволява минаваш в действителност името на функция във вашия Python код, вместо конкретния начин че това е най. Така че аз може да има също толкова лесно пренасочени на потребителя да наклонена черта, което ще го изпрати обратно у дома, но използване на URL адреса за функция е хубаво, защото ако промените място, където нещата са, така че нека да кажа, че мога да променя начало да бъде в / у дома, вместо да, това пак би след това се върнете / дома, защото всъщност отива и поглежда нагоре името на функцията, и то ще ви даде обратно на URL адреса за това. Така че, един вид на предположение, че сте по-вероятно да се промени, където нещата са, от имената на функциите. Можете да използвате тази наистина хубаво URL за функция. И едно нещо, за да се запознаят с че е малко по-сложно, е, че си мислиш, че може просто да обадете се пренасочи на URL адреса за, но всъщност всички маршрути има за да се върнете някакъв текст и HTML, така че вие ​​всъщност трябва да върне пренасочи повикването. В противен случай, ще се получи нещо невалидна, за да не се връщат низ, защото всички те трябва да се върне на HTML всъщност искате да направят. И така, когато ти се обадя пренасочването, той ви пренасочва към страницата, но всъщност връща HTML което трябва да се изпълни, че пренасочване. Върни се на началната страница. Така че ние имаме тези две различни гледни точки. Имаме мнението дома. Или, аз предполагам, че трябва да се каже, шаблони. Ние имаме тези две шаблони, шаблона дома, които показва всички наши постове, и След това имаме тази реклама нещо, и когато щракнете върху гредата, тя отива в нов маршрут в колба, но този път не е задължително имат съответния шаблон. Вие не трябва да се види нищо, но все още можете да имат тази работа ще зад кулисите. И тогава ще се пренасочи Обратно към началната страница. И със сигурност, че е лесно да се работи в някои по-хубав, CSS в шаблона и ще я направи да изглежда много по-хубав, но всички основни логика е налице в Питон. Всякакви въпроси относно този пример? Знам, че има много различни неща се случват там, много неща, които не бях виждал и преди, но като нищо. Да. ПУБЛИКАТА 1: Имате ли да се направи нещо специално да търкат данните, които е подадена от формата? Забелязах, че току-що каза "да създаде" Езра ZIGMOND: Да, така че това е Всъщност, това е една наистина добра точка. Така че въпросът е, което правите Трябва да се провери и да се уверите, че данните са валидни, и направя някаква търкане за да се уверите, че той е валиден, тъй като може да видите тук, Аз не правя това. Така че нека да видим какво ще стане ако публикувате нещо празно. Значи, това всъщност ще направи точно празно пост и попълнете DateTime. Така че в действителност, Вие вероятно ще искам да направя нещо подобно, Може би, ако посочите заглавието, се равнява на празен низ, тогава не правим това. Или само да го направя, ако заглавието е не е равно на празен низ. Така че това не е така в действителност автоматично се грижат за това очистване за вас, така че все още трябва да се направи това. Да, добър въпрос. АУДИТОРИЯ 2: Има ли скраб за продължението инжекция? Знаеш ли? Езра ZIGMOND: Да се ​​надяваме, Пи- луи прави това. Мисля, че това със сигурност ще бъде доста лоша библиотека, ако не се направи това. Аз не знам точно. Бих трябва да погледнем в заявка че генерирани. Мисля, че ако аз напечатани в блог пост, че нещо като погледна като SQL инжекция атаки, нещо като това, ако това е като поле за парола или нещо, може да се направи нещо подобно. Мисля, че все още ще получите буквално е публикувал, но аз мисля, че Пи- луи прави някакъв вид пречистване на данните преди тя действително го изпълнява. ПУБЛИКАТА 1: Това е текстово поле предназначена да отнеме обикновен текст, нали? Езра ZIGMOND: Да, това е. Да. Така че аз мисля, че всички, така че това е правилното поведение, който ще направи това, но аз мисля, че Пи- луи надявам се върши някакъв вид защита на техния край. И ако искате да двойна проверка, че има начини, когато генерирате заявка. така че не е нужно да се го изпълни директно. Бих трябва да вземе Посетете документация, но всъщност можете да разглеждаш SQL, че тя се генерира, и да погледнем на това, както и да уверите, че е бягство неща. Друга причина, поради които може да искате да погледнете на SQL че Пи- луи се извежда, ако е неща, като че ли се случва наистина бавно, можете да погледнете и да видим за какво става всъщност прави, защото това е понякога лесно да се случайно добавите в, така, както го пише, случайно да го има изберете цялата база данни на първо място, и след това да се направи някаква работа на които, когато наистина означаваше, за да изберете една подгрупа. И така, ако нещата не са доста ще полето, това е добре да погледнете по искане това е всъщност да е генериран. Да. АУДИТОРИЯ 2: Когато за първи път започнах, ще ви постави в пристанището като 5000. Езра ZIGMOND: Да. АУДИТОРИЯ 2: е по подразбиране с Пи- луи, или е нещо, което можете да промените? Езра ZIGMOND: Да, така че порт е по подразбиране с колба. Ако го използвате без уточнява нищо, тя автоматично ще направи това. Аз вярвам, че ще трябва да се удвои проверите това, но можете да се уточни, че в app.run, Мисля, че можете да направите нещо подобно, порт = 8080. Нека да дам, че се опита бързо. Да, така че може просто зададени порт = 8080, и тя ще го изпълним там, което мисля, ако искате да го ползвате на логическо устройство, не съм пробвал този вън, но аз мисля, че ако тя се завтече на порт 8080, може би ще бъде в състояние за достъп до сървъра, точно като сте били на сайта. Да, но това е лесно да се променят, че ако има ли нещо като порт-спедиция неща, които трябва да направите. Всякакви други въпроси? Да? ПУБЛИКАТА 1: Значи, аз видях във вашия модели, които, както ви споменах, вие трябва да посочите база данни за всеки обект. Случайно да знаете, прави които го правят много лесно, ако имате много SQLite бази данни, които сте искате да използвате за един единствен уеб приложение, че може просто да посочите един куп на различни такива във вашия модел? Езра ZIGMOND: Да, нека отворите, че до бързо. Така че, вие казвате, ако искате да имате куп различно нещо, може би харесва и студентите, за някои причина, нещо такова? Да, така мисля, че вие все още, всеки модел би трябвало да има само още една база данни, предназначен за него, но ако искате да имате различни модели, са възложени на различни обекти на базата данни към него, вие определено може да направи това. Така че, ако съм създал нова, нещо като това, а сега и това е студент, че изглежда странно като блог пост, Можех да се уточни, че база данни, е равна на db_2 тук. Така че, мисля, че това е най- Основният начин можете да направите това. Готино. Всякакви други въпроси? Така че просто да свършим малко битов, ето някои ресурси, и тези слайдове ще бъдат публикувани онлайн така че можете действително да стигнем до тези връзки. Най-добрите източници са наистина документацията за Flask и самите Пи- луи. Те са написани много добре, мисля. Така че, на интернет страницата на стъкленицата е тук, и те имат QuickStart настойнически, че Ще преминете през подобна неща за това, което мина през, но ако искате някаква преглед от нещата, които съм та преминаха или си мислиш, че аз обясних нещо в объркващ начин, те ще имат подобни примери има. Пи- луи има документация, както и те имат QuickStart настойнически че отива над основните параметри че вие ​​ще искате да използвате. Така че, нещата, които говореха за с уникалните и уточняващи по подразбиране, различните сортове полета, които можете да използвате, тези, всичко щеше да е там. Също така, ако имате въпроси за Пи- луи, и можете да ги публикувате в stackoverflow, човекът, който направи Пи- луи всъщност продължава и отговаря на тези понякога. Ако имате въпрос, да се надяваме той ще бъде в състояние да му отговори, защото той е написал цялата работа. Мисля, че това е всичко, Исках да покрие. Благодаря за излизане.