[השמעת מוסיקה] עזרא זיגמונד: היי, כולם. תודה על שיוצא היום. סמינר זה הוא "פייתון Web Apps עם בקבוק. " אז, אני הולך לדבר קצת על למה אולי כדאי לך להשתמש בבקבוק כדי לעשות יישומי אינטרנט עם פייתון, בניגוד לכמה מסגרות אחרות שם בחוץ, כמו יחידת, שהוא ידוע ביותר. הכתוביות היא "ו פיווי, "וזה משהו ש אנחנו הולכים לדבר על איך כדי לקיים אינטראקציה עם מסדי נתונים של SQL. זה עושה את זה ממש נחמד. אז, הנה רק סקירה מהירה ממה שאני רוצה ללכת על. אז, ראשון, רק שקופית אחת זה הולך להיות התחלה מהירה, אשר הוא איך להשיג כל מה ש להגדיר במחשב שלך. אני הולך להיות הפגנה זה במחשב Mac המקומי שלי, רק בגלל שזה המקום שבו עשיתי את זה לפני, אני הכי נוח עם זה, אבל זה בהחלט אפשרי על IDE CD50. אז, לאחר ש, אני רוצה להציג את מה שהיא צפחת, ולשכנע אותך למה שאתה צריך להשתמש בו במקום הראשון. ואז, אני אתן לי מהיר דוגמא למה שאתה יכול לעשות בצפחה, דוגמא מהירה של מה שאתה יכול לעשות בפיווי, ואז אני אראה לך יותר יישום דוגמא מלא כי אני להרכיב ש יכול ללכת דרך יחד. ולבסוף, ב השקופית האחרונה, יש לי כמה משאבים שאתה מסתכל באינטרנט לקבלת מידע נוסף. זה לא מלא הדרכה כיצד להשתמש בבקבוק. ואני מקווה לעזוב כמה זמן לשאלות. כל מי שצפה באופן מקומי, רק כמו, לצעוק באמצע אם יש לך שאלות. אז דברים התקנה מהירים, אם אתה רוצה לבצע יחד, או אם אתה רוצה לקבל את זה על המכונה שלך, אני הולך להיות באמצעות פייתון 2.7.10. הבקבוק עושה עבודה עם פייטון 3, אבל אני אוהב באמצעות פייתון 2, כי יש כמה חבילות פייתון ש לא עובד עם 3 עדיין. אם התקנת PIP, ש הוא מנהל חבילות Python, אני חושב שאם פייתון שלך הוא גדול או שווה ל2.7.9, יש לך את זה מותקן כבר, זה סופר קל להתקנת חבילות אלה. אתה יכול לעשות פיפס להתקין בקבוק, פיפס להתקין פיווי, בדרך כלל אתה צריך לרוץ sudo פשוט כך שההרשאות יסתדרו. ו, אם אתה משתמש ב סופר גרסה ישנה של פייתון, אני ממליץ לעדכן פייתון, או באמצעות EasyInstall להתקין PIP. לכן, השאלה הבאה היא, מה היא צפחת? ואני מניח, ראשון שאלה סבירה תהיתי במשך זמן רב הוא, מה הוא יישום אינטרנט? כי זה מילה שאני חושב שהוא נזרק סביב הרבה שאני לא באמת יודע. ואני חושב שטוב ביותר דוגמא למה הוא יישום אינטרנט, באמת CS50 האוצר, שבו זה לא באמת רק אתר אינטרנט, אבל זה משהו שאתה סוג של יכול לקיים אינטראקציה עם. יש חשבונות המשתמשים ו כל מיני דברים שונים. אז, איפה בדיוק אתה מצייר קו בין מה שהוא אתר אינטרנט, ומה הוא יישום אינטרנט, הוא סוג של שרירותי, אבל אני מניח שהרעיון, זה משהו יותר מאתר אינטרנט וזה יישום שימושי. אז, צפחת היא מסגרת ל מה שהופך את יישומי אינטרנט באמצעות פייתון. ואני מקווה, עד הסוף זה, אני אשכנע אותך כי בעצם אתה יכול לכתוב משהו כמו CS50 האוצר באמצעות פייתון, שבו אני כמו הרבה יותר טוב מאשר PHP, באופן אישי. אז, בקבוק הוא, שהם מכנים microframework, שבו, הם אומר שזה מאוד פשוט, אבל להרחבה. אז, יש לו רק מה שאתה צריך, אבל אם אתה רוצה יותר תכונות, זה קל להביא אותם ב. אבל רק בגלל שזה microframework, לא אומר שזה רק לפרויקטים קטנים. יש לי קישור כאן שאומר שאובמה השתמשה Flask בשנת 2012 לקמפיין שלו אתר, שאני מקווה, הוא משהו של הסבה. אבל הדבר שאני באמת אוהבים Flask הוא ש, זה לא ממש לעשות כל סוג של החלטות בשבילך. רק בגלל שאנחנו מדבר על יישומי אינטרנט, אני צריך להשוות אותו לRuby on מסילות ויחידה, אשר שניהם הן מסגרות גדולות, אבל שניהם עושים הנחות על איך שאתה רוצה אינטראקציה עם מסדי נתונים, איך אתה רוצה להציג שלך נופים, והם בהחלט היבטים טובים ש. לדוגמא, Ruby on Rails יש מערכת שיא פעילה זה, שהוא ממש נחמד דרך לאינטראקציה עם נתונים, אבל אם אתה רוצה להשתמש ברובה על Rails, אתה קשור לסוג של ש. אבל עם צפחת, כאני יהיה להראות לך עם פיווי, אתה יכול להשתמש בכל סוג של מסד הנתונים שברצונך, ואתה יכול פשוט למשוך את זה ב כהרחבה לבקבוק. אז בגלל זה אני באמת כמו צפחת, זה ש לא עושה הנחות לך המבוסס על דברים שאתה לא צריך באמת. אז, למה אתה צריך להשתמש צפחת? היתרונות הם, זה פשוט יש באמת את תכונות הליבה נבנה לתוך זה שאתה צריך. אז, אתה לא צריך לדאוג הבנת חבורה שלמה של דברים כי אתה לא צריך באמת. אתה לא צריך צריך לדאוג על כיבוי תכונות כי אתה לא צריך באמת. ו, כפי שציינתי, זה סופר קל להוסיף בסיומות של דברים שאתה צריך. חלקם, יש צפחת התמיכה שלהם לזה. אז יש משהו שנקרא Flask מנהל, שמשקף מנהל ש פנל שהיחידה מספקת, אשר נותנת לך דרך חזותית נחמדה לניהול אתר האינטרנט שלך. אבל שוב, אם אתה מה שהופך משהו פשוט, אתה כנראה לא צריך מנהל גדול פנל, אז אני חושב שזה סופר נחמד. והחסרונות הם, ש יש לך פחות כוח מהקופסה. לכן, כאשר אתה ראשון לפתוח את צפחת, ובתכנית פייתון, אתה פשוט להקליד מן הבקבוק * יבוא, או מה, אתה לא בדיוק לקבל את כל התכונות שאולי ירצו. ואז אתה צריך באופן מפורש יותר רשימת התכונות שאתה רוצה. אז זה חסרון אחד, אבל אני חושב שלבניית אתרים קטנים אפליקציות כמו שאני הולכים להיות הצגה שלך, זה לא ממש בעיה. ומה הוא הדבר האחרון אמור להגיד, שהוא טעות דפוס, הם שיש פחות סטנדרטיים אמנות לכיצד להשתמש Flask, רק בגלל שיש לא רב אנשים המשתמשים בה באופן מקצועי בהשוואה לאופטימיות. אז, אם אתה מסתכל משהו כמו, "איך אני עושה את x" ביחידה, אתה כנראה תמצא אותו. יש עיצוב טוב דפוסים אתה יכול להשתמש, אבל עם צפחת, זה סוג של ללכת בדרך משלך, רק בגלל שזה ספרייה די קטנה. אז הם אלה חסרונות, אבל אני חושב ש שזה עדיין ספרייה טובה לשימוש. אז בואו פשוט לקפוץ ישר לתוך הבקבוק. זה בהחלט לא הולך להיות הדרכה מלאה, אבל זה ייתן לך רעיון איך לבנות דברים, ואז אתה מרגיש בנוח הולך את ומסתכל על התיעוד ולגלות יותר. אז, תן לי לפתוח את באמת דוגמא פשוטה בהתחלה, ולהראות לך מה ש נראה, ואז לשבור אותו קצת יותר. אז זה כאן, תן לי להביא אותו פועל. אז, עכשיו יש לי ריצת הבקשה שלי. אני הולך לפתוח את Safari, ו זה פועל על המארח המקומי שלי. אז רק אני הולך לעשות את זה גדול יותר. אבל localhost: 5000 וכך, ברגע זה ממש, כל זה עושה הוא, כאשר אתה מבקר באתר האינטרנט, היא מדפיסה את "שלום Flask," שהוא לא סופר שימושי, אבל אני חושב שזה מגניב ש בקובץ הקטן הזה כאן, יש לנו ריצת שרת האינטרנט שמדפיס משהו. אז, בואו באמת נראים בקוד לשנייה, ולשבור אותו קצת. האם הגודל טוב לכולם כאן? אז, אני מקווה, שאתה קצת נוח להשתמש פייתון. אני מניח שאנחנו יכולים להסתכל ב פייתון ולקרוא אותו. אם יש לך שאלות על שום דבר, אני יכול גם ללכת על זה. אז השורה הראשונה היא, מן הבקבוק, אנו מייבאים, בקבוק עם הון "F" אשר הוא סוג של כל תכונות עיקריות שאתה צריך. בכל פעם שאתה כותב קובץ וצפחה באמצעות, אתה הולך רוצה לייבא את זה, רק בגלל שיש לו את כל הדברים העיקריים. הדבר הבא שאנחנו עושים, הוא ש קורא Flask פונקציה זו, רק כדי ליצור אובייקט אפליקציה, ואתה תמיד הולך רוצה לעשות את זה. ולאחר מכן, קפיצה ל תחתון במהירות, חלק זה הוא כאן, "If_name _ ==" _ main_ "'שהוא סוג של אמנת פייתון. אז זה יהיה רק ​​לבצע אם אתה לרוץ בקובץ זה ישירות באמצעות פייתון. לאחר מכן, אנו קוראים app.run, אשר יהיה בעצם להתחיל את היישום הולך. אז, זה המבנה העיקרי ש תצטרך בכל יישום Flask, הוא תצטרך את זה אפליקציה = צפחת (_NAME_), ולאחר מכן app.run. אז, שני הדברים שיש לי כאן, הם מה שאנו מכנים מסלולים. אז, בואו נדבר על ניתוב קצת יותר. אני אחזור לשקופית. אז הבסיסי ביותר מושג בבקבוק הוא ניתוב. וזה הרעיון שאתה להקצות פונקציות בפייתון לכתובות מסוימות בדף האינטרנט שלך. אז, בכל פעם שאתה רוצה כדי ליצור מסלול חדש, אתה משתמש app.route @ זה מעצב פונקציה. לכן, אם אתה לא מכיר מעצבי פונקציה בפייתון, זה המושג הזה ש מאפשר לך לקחת פונקציה ולהקיף אותו במשהו אחר. אז באמת, מה זה עושה מעצב, הוא שזה לוקח את הפונקציה מתחתיו, והיא מוסיפה מידע נוסף לזה, אבל מה בעצם Flask אין לגרום לזה לקרות הוא לא סופר חיוני, אבל מה שחשוב, הוא שלפני המסלול, אתה לשים app.route @ זה, ולאחר מכן הכתובת של המסלול, כך הקו הנטוי הוא מה שאנחנו ראה כאשר אנו פשוט לפתוח את דף האינטרנט. אז זה דף הבית. זה פשוט מסלול הקו הנטוי. ואז יש לך בפונקציה זו. שמו של הפונקציה יכול להיות מה שאתה רוצה. זה לא חייב בהכרח צריך לעשות עם המסלול. ואז, כל מה ש שובו של הפונקציה, הפונקציה צריכה להחזיר מחרוזת. ויכולה מחרוזת ש להכיל HTML או כל דבר, וזה בעצם מה שיקבל חזרתי לדפדפן האינטרנט שלך כמו HTML, וזה יהפוך את זה. אז זה אותו הקוד שהיה מהדוגמא כי אני פשוט רצתי, ולכן כאשר אנו מבקרים קו נטוי, הוא קורא פונקצית שלום עולם, ש רק מחזירה מחרוזת, שלום Flask, ושמקבל מודפס על המסך. אז יש דוגמא נוספת, שהוא, בעת ביקור / שלום, היא מדפיסה את שלום Word, ש בעצם צריך לומר, שלום העולם, אבל בואו נעמיד פנים שהיה מכוון. אז בואו למשוך את זה עד ממש מהר. אז אם אתה הולך לlocalhost / שלום, זה עכשיו יהיה להדפיס משהו אחר. אז זה רק דוגמה קטנה על איך אתה יכול ליצור שני מסלולים שונים. כך, כל כך הרבה זה לא סופר שימושי, אין הרבה שאתה יכול לעשות, אתה פשוט יכול לעשות את כל זה עם יש דפי HTML שונים, וכאשר אתה מבקר מסוים דף זה פשוט טוען את הדף. אז בואו לראות כמה יותר דברים שימושיים שאתה יכול לעשות. אז, דבר אחד שאולי יש לך שם לב שבדוגמא שמשכתי עד, הוא שיש לי app.run (debug = True). וכך, מה זה טיעון באגים עושה, הוא כי כאשר אתה להפעיל את שרת האינטרנט שלך, כשאתה ביישום שלך, אם תשנה את קובץ, זה יהיה באופן אוטומטי לטעון מחדש את השרת. ואז אתה לא באמת צריך ההפעלה מחדש פייתון, שהוא סופר שימושי. אני יכול להראות את זה. תנו לי להרים את הקוד שלי עם טעות דפוס בזה, ולהעמיד פנים שטעות הדפוס שלשים שם בכוונה למטרות מאלפות. אז בואו נוסיף את זה בחזרה ב. אז עכשיו זה אומר שלום העולם. אני יחסוך את זה. ואם אנחנו מושכים בחזרה המסוף, אתה תמצאו אומר שזה הפעלה מחדש, כי זה זוהה שינוי, ואז עכשיו כשאנחנו טען מחדש דף זה, זה יהיה להדפיס את הדבר הנכון. אז באגים הוא סופר שימושי של. כמו כן, אם יש לך סוג של התרסקות, כך תן לי לעשות התרסקות יישום זה על ידי בעלה לא יחזור מחרוזת. אז, בואו פשוט יש לו לחזור אף אחד מסיבה כלשהי. ואז כשאני מבקר את זה דף, זה יהיה פשוט לקרוס, אבל השרת לא רק לקרוס, זה נותן לך בעצם חזרה סופר שימושי עקבות של כל מה שהשתבשו. ומה שבאמת נחמד, ש בשלב כלשהו בחצר אחורית זה, אתה יכול לפתוח אינטראקטיבי להפגיז כאן, וסוג של להדפיס את מה ש משתנים שאתה רוצה להעיף מבט על. וכך הוא באמת ניפוי שימושי לחישוב מה קורה עם שלך שרת, ולא רק לראות משהו ב- PHP כמו 500 פנימי שגיאת שרת, שהוא סופר חסר תועלת. דבר אחד כדי להיות מודע, הוא שאם אתה שם את האפליקציה שלך באינטרנט אז זה גלוי לציבור, אף פעם לא רוצה לצאת ממצב ניפוי שגיאות ב, כי למעשה אנשים יכולים להשתמש קונסולה ש הראה לך לבצע קוד שרירותי. אז הם יכולים להדפיס את כמו כל קודים סודיים שיש לך שם, הם יכולים להסתכל בדיוק איך האתר שלך עובד. אז זה באמת שימושי לבדיקה, אבל תמיד הקפד לקחת את זה לפני אתה מפרסם משהו באינטרנט. לכן, כאשר אתה משתמש במשהו כמו PHP, יש את הרעיון הזה שאתה יכול לעבור מידע בין דפי האינטרנט על ידי הצבת המידע בפועל ב- URL, אשר בקשת GET, אבל בצפחה, אתה בעצם יכול לעשות משהו כמו סוג של ש, על ידי בעל מסלול שיש משתנה כחלק ממנו. אז אם אתה מסתכל על זה דוגמא על המסך כאן, יש לנו מסלול זה ('/ שלום / "), וכן, אם אתה מבקר / שלום / משהו, שמשהו הוא הולך לקבל למעשה עם מילוי לשם משתנה. ושים לב שהפונקציה שמגיע עם מסלול ש יש לקחת בפרמטר שם, כך שהוא יהיה למעשה מועברים לפונקציה. ואז, ברגע שאתה בתוך הפונקציה ש, אתה יכול לטפל בזה כמו משתנה פייתון נורמלי, וכך אז, זה יהיה להדפיס את שלום, וזה ימלא את השם באמצעות עיצוב מסוים מחרוזת. אז כדי להוסיף חלקים משתנים לניתוב, אתה משתמש בתושבת זווית סימון. ולחלופין, אתה יכול להשתמש מה שנקרא ממיר. וכך, אם אתה שם את זה ביאור עם המעי הגס, אתה יכול לציין שזה int, או לצוף, או נתיב, וזה יהיה באופן אוטומטי להמיר את זה. גם אתה יכול לעשות את ההמרה בתוך פונקצית Python, רק באמצעות גבס, אבל לפעמים אם אתה רוצה להבטיח שזה int, אתה יכול לשים את זה שלטון המרה שם. אז בואו להרים את דוגמא של כמה כללים משתנים. אז הנה, זה יש את אותו בסיסי מבנה עם מיבוא Flask בקבוק, האפליקציה = צפחת (_NAME_), ואז זה פועל בסוף. יש לנו שני אלה שונים מסלולים משתנים כאן. והראשון, הוא אחד שהראיתי לי בשקופית, שהייתה ש זה פשוט לוקח בשם מחרוזת וזה יהיה להדפיס את שלום, שם. ואז, השני אחד משתמש בהמרה. אז זה יהיה באופן אוטומטי להמיר אותו לint, ולאחר מכן להכפיל את int, ולהדפיס את זה. ו, אנחנו לא עושים כל סוג המרה בתוכו כי Flask דואג ש. אז בואו לקבל זה ריצה. כאשר יש לך בקבוק ריצת יישום, אתה יכול לשלוט ב- C מחוץ לזה כדי לעצור את ריצת השרת. ואז אני ארוץ משתנים. אז בואו נלך לlocalhost / שלום / עזרא ו אני מקווה, זה אומר לי שלום. אז זה לקח בשם שלי, במשתנה מסלול, וזה מילא אותו בכאן. אז גם אני אראה מהיר דוגמא להכפלה. אז אם אתה הולך ל/ כפול / 3, הוא יודפס 6 החוצה. אז זה טיפל ב ההמרה עבורנו. אז אתה גם יכול לעשות את זה עם לצוף, ומשהו מיוחד, אם אתה צריך לציין משהו כמו נתיב, המאפשר לו לקבל את החתכים, אבל זה לא צריך בדרך כלל להיות בעיה. עד כה, עדיין יש לי עתה חוזר מחרוזות, שהוא לא מאוד מעניין. אנחנו באמת יכולים לחזור מחרוזת HTML מילולית. אז בקוד אנחנו יכולים להכניס משהו כמו ב-התג כדי להפוך אותו נועז, אבל רוב הזמן אתה לא באמת רוצה להיות כתיבת קוד HTML בקוד פייתון. זה נהיה ממש מבולגן, וזה לא זמן טוב. בקבוק מאפשר לנו להפריד את HTML לתוך מה שנקרא התבנית, ולכן אם אתה חושב במונחים של מודל MVC שאתה מכיר, אני מקווה, מעבודה עם CS50 האוצר קצת, אתה יכול לחשוב על קבצי פייתון כיותר של בקר, שבו הם נמצאים באינטראקציה עם כל מה ש מודל נתונים אולי יש לך. ואז הם קוראים לי צפיות והעברת מידע לצפייה שב כדי למלא את המידע ב- HTML שהיא צריכה. ומה שאנו מכנים צפיות אלה הם תבניות בכיתה. אז Flask משתמש פייתון אחר מודול שזה באופן אוטומטי להתקין בעת ​​התקנת PIP בקבוק שנקרא ג'ינג'ה, ש מאפשר לך להוסיף אלה ביאורים לHTML שאתה רואה על המסך, המאפשר לי אתה מכניס דברים כמו תנאי, ולולאות לHTML. כך זה נראה קצת כמו איך אתה עשוי להשתמש PHP בתוך קובץ HTML, אבל זה רק כאשר הבקבוק שרת משמש את קובץ HTML, זה יפעל מנוע בניית תבנית זו ו לנתח דרך זה ולמלא דברים ב. אז יש צפחת פונקצית render_template שאתה יכול לראות בתחתית כאן. וכך, כאשר אתה מבקר בדף זה, זה יהפוך תבנית hello.html זה, ולאחר מכן למלא בדף ה- HTML. אז בואו פשוט לרוץ אמיתי זה מהיר, ותראה איך זה נראה, ואז אני אלך דרך קצת בפירוט רב יותר. אז, התבניות שלך הולכים ללכת בתיקיית תבניות. באופן אוטומטי זה ייראה ב תיקיית תבניות לתבנית ש. אז בואו לפתוח את זה. אז, אני ארוץ דוגמא בניית התבנית. אז אם אני הולך ל/ שלום / עזרא, יש לו את זה נורא, תג אוהל מגונה שאני שם ב. מאוד נחמד, מאוד דינמי. אני מעריץ גדול. אבל מה קורה אם רק אני הולך ל, / שלום? אז זה רק אומר שלום העולם. אני לא עברתי את זה שם, ו זה מילא אותו באופן אוטומטי. אז בואו לראות איך זה עשה את זה, ואיך אנחנו יכולים להיפטר מאוהל שאולי. אז הנה, זה סוג של דוגמא מעניינת ל, אם אתה מכיר איך מתג ההצהרות לעבוד בשפה. אומר שזה כמו סוג של, סוג זה של נפילה דרך, שבו אתה בעצם דו מסלולים שונים לאותה הפונקציה. אז אנו מייחסים / שלום המסלול ו / שלום / שם בדרך לשלום, ואנחנו לציין using-- פייתון מאפשר לך לציין arguments-- פונקצית ברירת מחדל כך שאם אין שם, כל כך אם אנחנו הולכים לסתם / שלום, זה באופן אוטומטי יסנן לשם שווה לאף אחד. אז, אנחנו הופכים את תבנית עם שם = שם, כך זה יעבור בשם הפרמטר שווה לפרמטר שם פונקציה זו, לתבנית. שעדיין לא מסביר איך הוא החלטה אם להדפיס שלום העולם, או להדפיס את השם שלי. אז בואו באמת נראים לתבנית עצמה, ותראה בו, כי הוא מגיע. אז, בתוך תבנית זו, אנחנו למעשה יש כמה היגיון מותנה, שיש אנשים שהיה טוען, שאתה באמת לא צריך הרבה מותנה היגיון בתוך התבנית שלך עצמו. זה צריך להיות יותר ב בקר, אבל לדוגמא זו זה משהו די קטן. אז הנה, אנחנו בודקים, אם שם, כל כך אם השם אינו שווה לאף אחד, אם שם הוא למעשה עבר ב, אז אנחנו אומר שלום, שמים עם כותרת והאוהל, כל HTML רגיל זה, אחרת, להדפיס את שלום, העולם פשוט כלל. אז כמה דברים ללב כאן על איך שאתה לאתחל את בניית התבנית, הוא ש, כל אלה הצהרות מותנות, כמו סוג של איך אנחנו PHP זה כש אתה רוצה להכניס קצת PHP, אתה משתמש בפחות מ שאלה סימן, זה סוג של אנלוגי כאן איתי {%. אז הנה, יש לנו הקוד המותנה שלנו. ואז, כשאתה באמת רוצה פשוטו כמשמעו להעריך משהו, והדפסה את זה על המסך, אתה להשתמש בסוגריים המסולסלים כפולים. אז הנה הפלטה הכפולה, ואז אנחנו לציין שם, כך בתוך זה, זה יהיה להעריך לשם משתנה, ש עבר מ לדקלם פונקצית תבנית, ולא רק הדפסה את, אם נפטרתי מאלה, זה יהיה להדפיס רק את המילה "שם". אז, זה משהו שצריך להיזהר. אז עוד דבר ל הודעה היא, שכאשר אנחנו רוצה להשתמש ב פונקצית render_template, אנחנו באמת צריכים לייבא זה באופן מפורש מבקבוק. וזה הוא דוגמה ל המודולריות של צפחת, כי אתה לא צריך לייבא דברים שאתה לא צריך. אתה פשוט יכול להביא ב פונקציות שאתה באמת צריך, שהוא לפעמים נחמד, כדי שלא צריך שיהיה לי כל הפונקציות האלה יושב סביבך שאתה לא משתמש, אבל גם, אם אתה שוכח שאתה צריך לייבא render_template, אתה בטח מקבל אזהרה שיודיע לך על זה. אז, כי הוא בניית תבנית. אז, יש לנו לראות כיצד להפוך את דפי אינטרנט פשוטים, ולהוסיף קצת יותר היגיון ל זה, במונחים של הניתוב משתנה. הוא מאפשר לך לעשות דברים שונים על בסיס מה כתובת אתר שאתה הולך ל, וגם לאחר מכן, לתת HTML קצת יותר הגיוני ב מבחינת איך שאתה רוצה להבהיר דברים. אתה לא צריך לשים את כל ה- HTML שלך בפייתון, אבל לדי הרבה כל יישום אינטרנט, אתה הולך רוצה כלשהו של מודל נתונים הקשורים אליו. וכך באופן מסורתי, היית זה משהו כמו מסד נתונים SQL. ואתה יכול רק אינטראקציה ישירות עם SQL. יש פייתון, אני חושב שזה נקרא. SQLite 3. אתה יכול פשוט לייבא SQLite 3 ו ביצוע שאילתות SQL ישירות, אבל אני לא יודע מה איתכם, אבל אני ממש לא אוהב, רק, כתיבה מתוך שאילתות SQL. הוא נוטה לקבל באמת ארוך ומסובך. וכך, משהו ש אני רוצה להשתמש הוא מה ידוע כORM, שהוא יחסי אובייקט מיפוי. ונקודת מיפוי יחסי אובייקט, הוא שיש שני שונים דרכים אתה יכול לחשוב על מסדי נתונים. אז הדוגמא ש פרופ מלאן בדרך כלל משתמש בכיתה, הוא שולחן Excel, שבו יש לך שורות אלה ועמודות אלה, וזה באמת שימושי ל איך זה מיוצג בSQL ואיך אתה מתקשר עם זה, אבל דרך נוספת שזה בעצם שימושי לחשוב על זה לפעמים, הוא במונחים של שיעורים ואובייקטים. אז במקום לחשוב של כל שולחן כבעל שורה זו שיש מסוים מידע, שאתה באמת יכול חושב על זה כ כל שולחן הוא בכיתה, ולאחר מכן כל מקרה של יש בכיתה מאפיינים מסוימים. אז, בדוגמא זו, המופעים של הכיתה הן השורות בטבלה, ולאחר מכן כל נכס היית להיות עמודה בטבלה. אז, ORM שאני אוהב להשתמש נקרא פיווי. זה ממש קטן, כמו סוג של הבקבוק. אני חושב שהם הולכים טובים ביחד, אבל יש הרבה ORMs האחר שאתה יכול להשתמש. אחד פופולרי יותר הוא ידוע כSQLAlchemy, ואני לא זוכר למה אני במקור בחר פיווי על SQLAlchemy, או הייתי אומר לך למה אני חושב שזה אחד הטוב ביותר, אבל אנחנו רק הולכים להשתמש בזה אחד כי אני יודע איך להשתמש בו. אז, שאלה אחת היא, מדוע אתה צריך לטרוח באמצעות ORM, במקום רק ישירות כתיבת שאילתות SQL? ואני חושב שמקרה הטוב, הוא שאתה לא ממש צריך לכתוב שאילתות SQL. זה הרבה יותר קל, כפי שאני אראה לך, ל לעשות דברים כמו בחירה, הכנסה, מחיקה, במיוחד יצירת טבלאות. זה הרבה יותר קל ל לכתוב מבנה מעמדי, מאשר לבנות צור הצהרת שולחן, אבל דבר אחד להיות מודע, הוא ש ORM ינסה כמיטב היכולת כדי להבין מה הכי שאילתא SQL יעילה תהיה, אבל לפעמים הוא מקבל את זה לא נכון. ובמיוחד אם אתה עבודה עם מסד נתונים גדול, אתה יכול לשים לב ששאילתא שיש לפעול במהירות, הוא למעשה לוקח יותר זמן. ואם אתה מסתכל מתחת למכסת המנוע בכמה ORM מפרש שלSQL, זה יכול לעשות משהו באמת מגוחך, רק בגלל שזה סוג של החווה הכוונות שלך לא בסדר. ו, היו פעמים שבי היה לי לעקוף אותו, ורק ביצוע שאילתות SQL שלי, רק כי זה היה ניתוח באופן מוזר. אז, יש כמה מעל, רק בדרך שזה הידור שלך הצהרות לתוך SQL. אז, בואו נסתכל סופר במהירות ב דוגמא פשוטה של ​​מודל נתונים שיהיה אפשר להשתמש. אז, זה קוד פייתון, וכך הדבר הראשון שאתה רוצה לעשות הוא מ * יבוא פיווי. אז, שלא כמו צפחת, שבו יש לך כל מודולים בודדים אלה, ואתה רוצה לייבא צפחת, ו לכתוב תבנית, וכמה אחרים שנראה בהמשך, מפיווי, רק אתה יכול לייבא כל דבר, כי זה ספרייה די קטנה. לכן, הדבר הראשון שאתה רוצה לעשות, הוא למעשה ליצור אובייקט מסד נתונים זה. אז, יש לך db = SqliteDatabase, ולאחר מכן את השם של מסד הנתונים שלך. וזה יהיה ממש ליצור אובייקט מסד נתונים כי אתה יכול לקיים אינטראקציה עם, עם פיווי. ואז, יש לנו בפועל מודל שאנו רוצים ליצור. אז השולחן שאנחנו רוצים ליצור. אז, בתוך פיווי, כל כיתה יש שולחן משלו בתוך בסיס הנתונים שלך. אז, כל הכיתות יורש ממודל הבסיס, ומודל M ההון הוא משהו שמוגדר בפיווי. אז, כל הדגמים שלך צריך תירש כsuperclass הגבוה ביותר שלהם, הם צריכים לרשת מ מודל, אבל מה שבאמת מגניב, הוא שאתה יכול למעשה יש לך מודלים יירשו אחד מהשני. והרבה הזמן, שלך מודלים של נתונים לא בהכרח להפוך את היררכית ירושה נחמדה, אבל פעמים שבו הם עושים, זה ממש נחמד, כי יש לך המודל טבוע אחד מהשני. לכן, אנו מוגדרים המעמד הזה "סטודנט", שיורש מודל, ויש לו שלושה מאפיינים. יש לו תעודת זהות, שהוא PrimaryKeyField, ש הוא משהו שספק על ידי פיווי, שם הוא CharField, וכיתה היא IntegerField. אז זה יכול או לא יכול להיות איך CS50 בעצם מאחסן את כל הציונים של התלמידים. זה לא, אבל זה איך אני אעשה את זה. ולאחר מכן יש לו, בתוך המעמד הזה, וזה משהו שאתה יכול לעשות עם פייטון, אתה יכול לקבל שיעורים מקוננים. וזה משהו מה שנדרש על ידי פיווי. אז, Meta המעמד הזה, יש לך כדי לציין שהנתונים הוא שווה לאובייקט שיצרנו לעיל. וזה אומר מה הוא קובץ טבלה זו למעשה הולך להיות כלול ב. אז זה משהו שיש לך לעשות בתוך כל הדגמים שלך. אתה פשוט צריך לציין בתוך כיתה מטה זה מסד הנתונים שהוא שווה לdb. אז מה אני עושה בדרך כלל, אם יש לי חבורה של דגמים שונים, הוא שיש לי בסיס אחד מודל, שאני בדרך כלל רק מכנה "מודל בסיס" שיש לו את המעמד מטה, וזה קובע את בסיס הנתונים שווים לdb. ולאחר מכן את כל הדגמים שלאחר מכן שלי יירש שממחלקת הבסיס. ואז אני לא צריך לדאוג על הגדרת המעמד מטה. לכן, כאשר זו מקבלת למעשה מלוקט לתוך משפט SQL, זה נראה כמו הדבר המגעיל הזה למטה כאן, "צור שלם תעודת סטודנט שולחן, " מה שתגיד. וכן, אני חושב שזה קצר יותר, שאילתא זו SQL ממש כאן, אבל אם אתה מסתכל על זה בכיתה כאן אתה יכול לראות בדיוק מה קורה. אתה יכול לראות מה מיני תחומים יש, מה הם נקראים, וכך, אני חושב ש מסתכל על קוד פייתון זה הוא הרבה יותר קריא מ מנסה לכתוב שאילתא SQL זו. אז, על מנת למעשה להשתמש במסד הנתונים, אנחנו צריכים להתחבר אליו בפייתון. אז, אני בדרך כלל לכתוב פונקציה שנקראת initialize_db שעושה שני דברים. זה לוקח באתר db אובייקט וזה מתחבר לזה, שרק נפתח עד סעיף למסד הנתונים. אם אתה רק פועל למרות אתר במחשב המקומי שלך, זה לא סופר עניין גדול לדאגה על חיבור וניתוק, אבל אם אתה מפעיל שלו באתר אינטרנט, אתה רוצה לוודא ש, כל פעם שמשתמש מתחבר לזה, כשהם סוגרים את האתר, הם נתקו, כך שאתה אין לי חבורה של אנשים מחוברים למסד הנתונים שלך בבת אחת. ולאחר מכן, כאשר אתה להתחבר למסד הנתונים, אתה רוצה לקרוא לdb.create_tables, ורשימת הדגמים למה שאתה רוצה כדי ליצור טבלאות. אז הנה, אני רק רוצה ליצור אותו לתלמיד זה. ואז, מה שחשוב, הוא ל לציין הבטוח ביותר הזמן האמיתי =. אז מה הצהרה זו יעשה, הוא שזה יוצר שולחנות ל מודל תלמיד, אלא רק אם שולחן שיש לא כבר נוצר. זה מה שמציין בטוח. אז זה לא יחליף השולחן הקיים שלך, זה יהיה רק ​​ליצור חדש שולחן אם אין אחד שם. אז, אתה יכול פשוט ליצור השולחנות אחת באמצעות SQL. ואז יש לי שישיבת מסד הנתונים שם, ולאחר מכן חבר בכל פעם, אבל זה בדרך כלל נחמד רק ל לשים בשיחת create_tables זה, כך שאם אי פעם למוחקך מסד הנתונים כאשר אתה מפעיל האינטרנט שלך אפליקציה שוב, זה יהיה לשחזר אותו. אז, רק לוודא שבטוח מצוין להיות אמיתי, או שאתה תמצא את הנתונים שלך פשוט מקבל חבט בכל פעם. ואז, אתה יכול פשוט לקרוא initialize_db להקים חיבור, וליצור שולחנות במידת צורך. לכן, הדבר הנפוץ ביותר כי אתה רוצה לעשות, או אחד הדברים הנפוצים ביותר, הוא להכניס למעשה דברים לתוך מסד הנתונים שלך. וכך, במקום שיש לכתוב להכניס לתוך הצהרה עם כל הערכים שצוינו, למעשה אתה יכול להתקשר פונקציה בכיתת התלמיד. לכן, כאשר אתה יוצר כיתה שיורש ממודל, יש ליצור שיטה זו. אז, אתה עושה name.create כיתה, ומפרט את הפרמטרים שאתה רוצה להעביר ב. לכן, אם אני רוצה להוסיף כמה תלמידים לדוגמא הספר בכיתה CS50, אני אשים בדוד, שיש לו כיתה טובה מאוד, יש לו 95. ואת עצמי, שלא עושה כל כך טוב בCS50, יש לי 50. וכך, על הדבר נחמד מה פונקציה ליצור את זה עושה, הוא שזה מחזיר את הדוגמא, או שורה, שנוצר בתוך הטבלה, ואז אתה מאחסן שב משתנה, ועבודה עם אותו מאוחר יותר. באפשרותך לשנות בסביבה, ש אני אראה דוגמא של. שימו לב שאני לא יש לציין את קוד זיהוי, משום שכן הוא PrimaryKeyField, באופן אוטומטי זה יהיה להגדיל אותו אם אתה לא לציין את זה. ואכן, סביר להניח ש לא צריך לציין את זה, בגלל טעות שאולי לכסח את תעודת זהות של מישהו אחר. ואתה רוצה לעשות בטוח שזה ייחודי. אז, למעשה, רוב דבר שכיח שאתה רוצה לעשות, הוא כנראה בחר את של מסד הנתונים ברגע שאתה יש הרבה מידע שם. וכך, אם אתה רוצה לקבל הכל, כך המקביל של הכוכב הנבחרים מהצהרת תלמידים, זה יהיה student.select רק. וזה ייתן לך בחזרה מערך עם כל תלמיד אובייקטים בזה שאתה לחזר על שאתה רוצה. אתה יכול להוציא את דברים מזה. ורוב הזמן, אתה לא רק רוצה לעשות בחר, אתה באמת רוצה לציין משהו. וכך, אתה יכול שרשרת יחד שיחות פונקציה אלה, כמו איך היית שרשרת יחד הדוחות ב- SQL. אז אתה יכול לעשות student.select (). בי בדוגמא זו. ואז, אתה יכול ציין את התנאים, רק באמצעות פייתון הרגיל Booleans לבדוק דברים. לכן, במקרה זה, אתה רוצה להגביל את מה שאתה בוחר ל, שם student.grade שווה 50, וstudent.name שווה לעזרא, כך שרק יוציא אותי מזה. ושים לב, אחד באמת דבר עדין כאן הוא כי, אם ברצונך לציין ו / או ואו / או, בפייתון, שהיית בדרך כלל להשתמש, אני חושב שהמילה "ו-" למעשה, אבל כאן אתה משתמש אמפרסנד היחיד, שהיא בדרך כלל מפעיל סיבי האופרטור, אבל במקרה מיוחד זה, רק פיווי הדרך עושה את זה, אתה משתמש באחת אמפרסנד לציין "ו." זה משהו ש אני מתערבבים הרבה, אבל זה לא בא אותו כי הרבה בפועל. ואז, ברגע שיש לך את כל הסטודנטים מבסיס הנתונים, ברגע שאתה עושה אתה בחר ולבוש או מה שלך, אתה יכול להשתמש בלולאת foreach, בדיוק כמו רגיל בפייתון, עם כל סוג של איטרטור או עם כל סוג של מערך. אז אתה יכול לעשות, לים בstudent.select (). whe מחדש (Student.grade <75), וכן את הרצון הזה לחזר על כל תלמיד בטבלה הכיתה שלו הוא פחות מ -75, ש במקרה זה, הוא עדיין רק לי. ואז אתה יכול לעשות משהו ב לולאה ש, כמו לשלוח לי מייל ותגיד לי באמת להפוך בסטי הבעיה שלי. אז, אתה יכול עוד דבר לעשות, זה ממש קל לעדכן שורות בתוך הטבלה. אז, זוכר לחזור לכאן, שלך כשהוכנסתי, לקחתי את הערך שהיה חזר על ידי student.create, ואני שהוקצה אותו לשם בשם עזרא. אז עכשיו, אתה יכול לשנות את ערכים בתוך מקרה זה, בדיוק כמו שהיית כיתה רגילה בפייתון. אז אתה יכול להגדיר ezra.grade = 95 ו שיעדכן את העותק המקומי, אבל אם אתה באמת רוצה להתחייב שינוי שלמסד נתונים, אתה צריך לקרוא ezra.save, אז אתה נקרא שיטת-save במופע. אז עכשיו, יש לי השתנה בהצלחה הכיתה שלי בתוך מסד הנתונים. אז, אז נניח שאני להיתפס שינוי הכיתה שלי בתוך מסד הנתונים. פרופ מלאן כנראה הולך לרוצה למחוק אותי מהכיתה, ואז אתה יכול לקרוא .delete שיטה למשל רק על הדבר הזה. לכן, אם אתה רוצה ללכת בחזרה ללולאה זה כאן, ובעצם, במקום של שליחת הודעות דוא"ל כל של תלמידי הכיתה שהיא פחות מ -75, שרצית למחוק אותם, בתוך לולאה זה אתה יכול קורא למשל s.delete. והדבר האחרון שאתה רוצה לעשות, הוא כל פעם שאתה ליצור חיבור, ותסיים עם העבודה שלך, אתה רוצה לקרוא לdb.close, שם DB הוא מסד נתונים ש מתנגד שהיו לנו בעבר. ואתה רוצה לוודא ש כל מה שמקבל סגור מחוץ. מגניב. אז עכשיו, יש לי בקשת דוגמא. אני כבר סוג של טרום-עשיתי כל מה שרק כדי שלא יהיה שום קידוד חי טעויות, אבל אנחנו יכולים ללכת דרך זה ולראות איך היית לשים Flask ופיווי יחד, ולהפוך את אפליקציה פשוטה. אני קורא לזה בטרוף CS50, וזה סוג של פלטפורמת בלוג פשוט. אז, ראשון, אני להפעיל אותו ו להראות איך זה נראה, ואז אנחנו יכולים להסתכל יותר לקוד. אוקיי, אז בואו פשוט להפעיל את זה. מגניב, אני אעשה את זה קצת קטן יותר. זה לא מאוד יפה, רק בגלל ש אני לא עושה הרבה CSS, אבל מה שהוא עושה הוא, יש לו מסד נתונים זה של בלוג, והוא עובר את כל שלהם, והוא יציג אותם בדף לפי סדר האחרון. ולכן אלה הם רק כמה הודעות שהצלתי באתר. אז אם אנחנו רוצים ליצור חדשים הודעה, אנחנו יכולים ללכת להוספת הודעה חדשה, ואנחנו יכולים להיכנס לכותרת של הודעה, כל כך משהו כמו, סמינר CS50. וואו, ממש נהנה הסמינר. מגניב. אז אתה לוחץ הודעה, וזה יהיה להפנות אותך חזרה לדף הבית, ואז אתה תראה ש ההודעה האחרונה נוספה. ועדיין יש לנו את כל אלה יש. אז עכשיו, בואו לצעוד דרך כל קוד ולראות איך זה מיושם. אז, אני חושב שהדבר הראשון שבואו תסתכל, למעשה הוא המודלים. הרבה הזמן, כאשר אתה מעצב משהו, אתה רוצה לחשוב על איך ראשון אתה הולך לייצג את הנתונים שלך, ולאחר מכן לעצב דברים מסביב ש, כך שכל מה שהגיוני. וכי הוא למעשה איך אני עשיתי את זה כשאני היה עושה את זה, ישבתי וחשבתי, מה שאני רוצה בפוסט. אז, הנה, יש לנו את אותו המבנה שאני להזכיר קודם לכן, שבו אנחנו עושים db = Sqldatabase ('posts.db'). במציאות, אתה כנראה לא רוצה קוד קשה במאגרי המידע של השם שלך. זה כנראה צריך להיות פרמטר שמאוחסן אי שם, אולי בקובץ הגדרות, אבל ב דוגמא קטנה כמו זה, זה בסדר קוד קשה שב. אז עכשיו, יש לנו בכיתה הודעה זו, אשר יורש ממודל הבסיס. ויש לו, שוב, ID = PrimaryKeyField. למעשה, אם לא תציין, אם אני באמת נפטרתי מזה, אז פיווי אנו דואגים ל באופן אוטומטי יצירת ששדה מזהה, וזה באופן אוטומטי לעשות את זה PrimaryKey, ש אני חושב שזה ממש נחמד, כי בדרך כלל, זה משהו שאתה רוצה שיהיה לי, אבל אני רוצה לשים את זה באופן ספציפי, רק כך אני זוכר שזה שם. אבל אם לא תציין כי, שיהיה שם באופן אוטומטי. אז, יש לי תאריך ש הוא DateTimeField, וכל תחומים שונים אלה, אם אתה מסתכל על תיעוד פיווי, זה ייתן לך רשימה של שונה סוגים של שדות שאתה יכול להשתמש. על פי רוב, זה מקביל למה היית רואה ב- SQL. אז יש CharField, VarCharFields, TextFields, אשר במשך זמן רב מאוד טקסטים, כמו לכתוב בלוג פוטנציאל, DateTimeFields, DoubleFields, FloatFields, כל מיני הדברים כאלה. ואתה יכול לעבור בטיעונים אחרים לזה, שאני לא יציין כאן. נניח, למשל, שאתה לא רוצה לאפשר לשתי הודעות ליש לו שם, אתה יכול לציין משהו כמו ייחודי = נכון, וזה רק פרמטר נוסף ל השדה שכאשר זה הידור אותו לSQL, זה יהיה לציין כי יש לו להיות ייחודי. ניתן גם לציין משהו כמו לא ריק וכל הדברים האחרים אתה עושה בדרך כלל ב- SQL. אז, זה די פשוט מודל שיש לו את התאריך. שים לב כאן, בתוך DateTimeField, אני צוין מה הוא ברירת המחדל. אני צוין שזה יהיה datetime.datetime.now, בגלל הדרך ש זה מקבל הערכה, זה באמת מעריך DateTime.Now כאשר הוא מקבל מוכנס לתוך מסד הנתונים. אני חושב ש, שיהיה לי להכפיל לבדוק את זה, אבל אם עשית משהו כזה, אז זה היה בעצם להעריך כי ברגע, ולאחר מכן DateTime תמיד יהיה אותו הדבר. אז, רק אם אתה עושה משהו עם datetimes, בדוק שזה הערכה כאשר למעשה מקבל מוכנס, או אחר אתה עלול להיות מבולבל. הכותרת היא רק CharField, שיש יותר טיעונים אתה יכול לעבור בציון בדיוק כמה זמן אתה רוצה שזה יהיה, אבל כאן, זה לא משנה באמת. וטקסט הולך להיות את הטקסט של כל ההודעה, וזה הולך להיות TextField רק בגלל שאתה רוצה כדי לאפשר לו להיות מחרוזת ארוכה למדי. אז יש לנו מטה זה תת שרק מציין, כי אנחנו רוצים את מסד הנתונים לאן זה נפתח למעשה ל להיות אובייקט db שיש לנו כאן. והדבר האחרון שיש לנו כאן, היא רק פונקציה זו שאנחנו הולכים להשתמש מהיישום העיקרי שלנו כדי לאתחל את מסד הנתונים כדי להתחבר ל זה, ולאחר מכן ליצור שולחן ההודעה. עכשיו, בואו נסתכל על היישום העיקרי עצמו. אז זה אחד הוא די עוד קצת יותר מאלה שראינו בעבר, אבל אני מקווה שלא יותר מדי רע. אז, תן לי להרחיב את זה. אוקי. אז, שם לב וראש אני מיובא חבורה של דברים אחרים לגמרי מן הבקבוק שיש לנו לא באמת ראה בעבר. ואני מקווה, שאנחנו יכולים לעבור כל אחד מאחד על ידי אלה אחד ולדבר קצת יותר על שלהם, מסודרים על ידי דוגמא. אז, יש לנו את הבקבוק, וrender_template, שראינו בעבר, אובייקט זה בקשה, אשר עולה כאשר אנו מסתכלים על איך הצורה שאני מראה למעשה עובד. הפניה, אשר מאפשר לך להפנות חזרה מצור ההודעה החדשה חזרה לעמוד הבית המקורי, ולאחר מכן כתובת אתר, וזה משהו שמאפשר לך להבין היכן ב אתר דף מסוים הוא. אז, הבא דבר שאני עושה, הוא שיבוא כל המידע מהמודלים קבצים שאנחנו פשוט מסתכלים. ו, כן. אז, משהו חדש אחר שמגיע עם כאשר אתה מתעסק, במיוחד מסדי נתונים, הוא שאתה יכול לציין פונקציה שמקבל נקראת לפני כל בקשה, ופונקציה שמקבלת קרא אחרי כל בקשה, באמצעות זה בקשת app.before מעצב פונקציה. ואז זה יהיה לקבל להורג בכל מקום בפונקציה זו היא. זה לא חייב להיות נקרא לפני הבקשה, אבל בדרך כלל זה משהו הגיוני לקרוא לזה. אתה יכול לציין מה פונקציה אתה רוצה לקבל נקרא שם, אז אני צוין initialize_db זה פונקציה שיש לנו גב במודלים קובץ, ולכן לפני כל בקשה, רוצה להתחבר למסד הנתונים. ישנם שני שונים דרכים אתה יכול לעשות את זה. אתה יכול לעשות אתapp., אני מאמין שזה after_request. וההבדל בין after_request וteardown_request, הוא שafter_request יקרה רק אם הבקשה למעשה הייתה בתוקף. וכך, רק אם הבקשה הייתה מוצלחת, אם שום דבר לא ישתבש, אבל teardown_request קורה במקרה של הצלחה בקשה, או במקרה של שגיאה. אז, בדרך כלל, אתה רוצה להשתמש teardown_request, אלא אם כן אתה רוצה לעשות משהו, שונה במיוחד במקרה של טעות. אבל רק לסגירת בסיס הנתונים, אם זה יצליח או אם זה לא מצליח, אנחנו עושים ברצונך להתנתק מבסיס הנתונים. אז זה נקרא, db.close על אובייקט db. שים לב שteardown_request לוקח ביוצא מן הכלל. אז אתה יכול לבדוק אם יש ממש שגיאה בעת שהסגירה, אבל כאן, בתקווה, שם לא הרבה שגיאות, לכן אנחנו פשוט סוג של התעלמות ש. אוקיי, וכל השאר הוא לא רע. לכן, כאשר אנחנו הולכים לדף הבית, אנחנו שניתנו תבנית home.html זה שייפתח. לעבור בהודעה שווה, ומה זה עושה הוא, לזכור שיש לנו את הפוסט הזה מודל, כך אנו בוחרים כל ההודעות שנכתבו, ואז עוד דבר שאתה יכול לעשות, ניתן לציין את הסעיף שבו, ניתן לציין להורות על ידי, ולכן אנחנו לוקחים כל ההודעות שנכתבו ש לקבל נבחרים, ולאחר מכן אנו מזמינים אותם על ידי post.date.descending. ואשר יפרט את, כאשר הם יוצאים למעשה, האחרון אחד יהיה הראשון אחד. ולאחר מכן, אנחנו עוברים את זה ב תבנית home.html, אז בואו למעשה לפתוח תבנית שבאמת מהירה, ותסתכל על איך זה עובד. וזה לא HTML הגדול, אבל אני מקווה, שנוכל להתמקד בפייתון. אז יש קישור לניו להוסיף הודעה, ואז זה מציין את המסלול בתוך הבקבוק ש להגדיר, שנמצא ממש כאן. זהו פוסט התוואי החדש, ואנחנו לציין שעד כאן. וכך הוא מקשר אז ילכו למסלול שבתוך שרת הבקבוק. הדבר מעניין יותר זה ללולאה כאן. אז אנחנו לציין שזה הודעה פרמטר ש עבר ל פונקצית render_template, לכל הודעה בפוסט של אובייקט שמקבל עבר ב. אנחנו רוצים להדפיס את כותרת ההודעה, בH1, ולאחר מכן בהמשך, אנחנו רוצים להדפיס את ההודעה הטקסט בתוך פסקה. וכאן, אנחנו באמת יכולים לקרוא לפונקציה Python, כדי שנוכל לקרוא strftime, ST-RF-זמן, ואתה יכול לעבור במחרוזת הפורמט שברצונך להדפיס את הנתונים ב. אז זה די נחמד שאתה יכול למעשה לקרוא לפונקצית פייתון זה מתוך כאן. אתה לא צריך לעשות את העיצוב ב צד בקר, כי באמת, עיצוב התאריך הוא משהו ש אתה רוצה להתמודד בתצוגה. וכל אלה אחוזים דברים הוא לא סופר חשוב. אם אתה מסתכל למעלה בתיעוד לפונקצית strftime בפייתון, זה מפרט את כל אלה דברים, אבל זה של איך, מתי שאנחנו מחפשים בדף הבית כאן, זה פורמטים זה עם נחמד תאריך, ובוקר הוא מציין או בערב, אבל בדרך כלל, אם לא היה לי זה כאן, אתה בטח מקבל כמה זבל תאריך שלא נראה טוב מאוד. ולאחר מכן אנו מגדירים את post.text, ושאני יכול יש לשים כמה מעברי שורה כאן, רק לשים בין כל הודעה כמה חללים. לכן, אני חושב חשוב ביותר דבר בדוגמא זו, הוא שאתה יכול להשתמש בזה ללולאה. וזה דומה ל דברים שאתה יכול לעשות בPHP. אתה יכול לחזר דרך, כל מה שמקבל בעבר, וכך, במקום שיש לעשות העתק / דבק, העתק / דבק כל HTML, אתה רק צריך לכתוב את זה פעם אחת, ולאחר מכן אתה יכול לחזר על כל ההודעות שנכתבו. וזה משהו נפוץ שברצונך לעשות, כאשר יש לך הרבה נתונים, הוא שעל כל דבר בנתונים שלך, אתה רוצה לעשות דבר דומה. ואז, רק לזכור, שכאשר אתה רוצה להדפיס משהו באופן מפורש ב- HTML, אתה משתמש ב הפלטה הכפולה כאן, אבל אז כאשר אתה רוצה לציין קצת מידע על מצב, או על ללולאה, אתה להשתמש בסוגר אחוזים. אז, חוזר לפייתון קוד, כך שמסביר מה שקורה בעיקרי מסלול, כאשר אנחנו הולכים לשם, זה פשוט מציג את כל הודעות, אבל אז השאלה הוא, איך אנחנו מקבלים למעשה הודעות לתוך מסד הנתונים, ש הוא קצת יותר מעניין. לכן, כאשר אתה לוחץ על חדש קישור הודעה, שראינו כאן, זה מפנה אותך לטופס זה. וזה רק שיחה פשוטה ל פונקצית render_template, אשר לאחר מכן עובר בפוסט החדש בטופס HTML. אז בואו נסתכל על זה. אז זה אחד הוא די פשוט. יש לה טופס HTML פשוט, ש ייראה קצת מוכר, המבוסס על הצורות בCS50 האוצר. וכך, אנו מציינים כאן, הפעולה. וכאן, אם אתה עובד עם PHP, בדרך כלל, זה יהיה משהו כמו, create.PHP, אבל כאן אנחנו בעצם לציין מסלול בתוך שרת הבקבוק. וכך, בדרך זו, מקבילה לתוואי ליצור שיש לנו כאן, ש נלך בשני. וכך, אנו מציינים כי זה פוסט שיטה, כי אנחנו רוצים לשלוח נתונים זה צורה, ובדרך כלל כאשר אתה שולח נתונים מטופס, אולי כדאי לך להשתמש בפוסט בקשה, רק כדי שלא בסופו עם כתובת האתר הגדול, המסורבל הזה. אבל אתה יכול גם להשתמש בבקשת GET, ולהעביר אותו בניתוב עם משתנה, אבל לצורות, זה נחמד לפוסט בקשה כאן. וכך לאחר מכן, בדיוק כמוך היה עושה עם HTML ו- PHP, אתה יכול לציין תשומות טקסט אלה, ואתה יכול לציין את שמם, וזה השם שיקבל עבר לאובייקט הבקשה בתוך הבקבוק. ואז יש לנו שלח כפתור שאומרת הודעה. וכאן, הודעה היא שמו של כפתור, כי זה פוסט בבלוג, אבל כאן, הודעה היא שיטת הבקשה. אז אלה הם אותה המילה אבל שאינו קשור למעשה. כֵּן חוזר לקוד פייתון, כאשר אנו נקראים ליצור שיטה, שם לב כאן שאתה יכול למעשה לציין במסלול שיטות הבקשה שאתה רוצה לקבל, ואז הנה, אני מציין לי ש רק רוצה לקבל את שיטת הודעה. לכן, אם אני ממש מנסה לבקר בדף ישירות, אשר באמצעות בקשת GET, הוא יגיד לי "שיטה אינה מותרת." וכך, יש לך דפים, כמו סוג של דף יצירה זו, שאני רק באמת משתמש כדרך ל הטופס כדי שהוגש, אתה יכול לציין שאתה לא רוצה שאנשים יוכלו ללכת לשם ישירות באמצעות בקשת GET, או אם אתה לא רוצה, מסיבה כלשהי, בקשת הודעה, אתה יכול פשוט לציין להגיע לכאן, אבל בדוגמא זו, אנחנו פשוט רוצה בקשת ההודעה לצאת. לכן, כאשר create_post נקרא, כאשר אנחנו מבקרים שבאמצעות בקשת ההודעה, בכל פעם שאתה הולך לבפרט מסלול, יש אובייקט בקשה זו, והיינו צריכים לייבא בקשות בחלקו העליון, אבל יש בקשה זו אובייקט שמקבל עבר ב, ואתה יכול לגשת לנתוני הטופס, אשר באופן אוטומטי לקבל מלא כאשר אתה שולח בקשה מטופס. ואז, מה שאני חושב זה ממש מגניב, הוא שאובייקט הטופס למועבר ב, הוא רק מילון פייתון ש מכיל, אם אתה access-- אז הנה, בואו שלי למשוך את HTML לידו, רק כך שאתה יכול להיות ש כנקודת התייחסות, כן, כל כך השמות שציינו כאן לתחומים השונים, כך הכותרת ואת הטקסט, אנחנו אז פשוט להשתמש באותם כאן כמדדים לנתוני הטופס. אז זה סופר נוח. אז אנחנו קוראים post.create, ש ייצור באופן אוטומטי ולהכניס הודעה אובייקט זה חדש לתוך מסד הנתונים. ואני חושב שזה ליצור פונקציה כאן היא דוגמא ממש מגניב של איך Flask רב עוצמה ועבודה עם זה, כי אם אתה עושה משהו ב- PHP, אולי יש לך ל לעשות הרבה אימות, היית צריך אז ליצור חיבור מסד נתונים, היית צריך אז להפעיל את שאילתא SQL, אבל כאן בדיוק יש לנו זה נחמד post.create, שאותם אנו יכולים רק לקבל את המידע החוצה של אובייקט הבקשה, ולאחר מכן להעביר אותו לחדש לפרסם שאנחנו יוצרים. ולאחר מכן, האחרון דבר שאנחנו רוצים לעשות, הוא להפנות בחזרה למשתמש הביתי. וכך אנו משתמשים זה בקבוק להפנות פונקציה. ומשהו שאנחנו לא ראינו לפני, הייתה פונקצית כתובת אתר זו. אז את כתובת האתר לפונקציה מאפשרת לי אתה עובר בלמעשה שם של פונקציה בקוד פייתון, במקום מסלול המסוים שזה ב. אז אני יכול להיות באותה קלות מנותב למשתמש לחתוך, שתשלח אותו בחזרה הביתה, אבל באמצעות כתובת האתר לפונקציה היא נחמדה, כי אם אתה לשנות את מיקום שבו דברים, אז נניח שאני משנה את הבית להיות ב/ בית במקום, זה היה עדיין אז לחזור / בית, משום שמתרחש בפועל ומסתכל למעלה שם הפונקציה, וזה ייתן לך לגבות את כתובת האתר על זה. אז, סוג של ב הנחה שאתה סביר יותר לשנות בו דברים הם, יותר מהשמות של הפונקציות. אתה יכול להשתמש בזה באמת כתובת אתר נחמד לפונקציה. ועוד דבר אחד כדי להיות מודע ל זה קצת מסובך, הוא שאתה חושב שאתה יכול פשוט קוראים להפנות על כתובת האתר ל, אבל בעצם כל הנתיבים יש לי לחזור קצת סוג של טקסט ו- HTML, אז אתה באמת צריך להחזיר את שיחת ההפניה. אחרת, אתה תקבל משהו לא חוקי על לא חוזר מחרוזת, בגלל כל אלה יש לחזור HTML אתה באמת רוצה להבהיר. וכך, כאשר אתה קורא את ההפניה, זה מפנה אותך לדף, אבל זה בעצם מחזיר את ה- HTML אתה צריך לבצע הפניה ש. חזור אל דף הבית. אז יש לנו שתי תצוגות שונות אלה. יש לנו את הנוף הביתה. או, אני מניח שאני צריך לומר תבניות. יש לנו שתי תבניות אלה, תבנית הבית ש מציג את כל ההודעות שלנו, ו אז יש לנו דבר פרסומת הזאת, וכאשר אתה לוחץ על ההודעה, זה הולך לתוואי חדש בתוך הבקבוק, אבל המסלול שאינו בהכרח יש תבנית מקבילה. אתה לא צריך לראות שום דבר, אבל אתה עדיין יכול יש לי עבודה זו הולכת מאחורי הקלעים. ואז אתה מקבל מנותב לגבות לדף הבית. ובהחלט, זה קל לעבוד בחלק CSS יותר נחמד לתבנית ולהפוך את זה נראה הרבה יותר נחמד, אבל כל ההיגיון העיקרי יש בפייתון. כל שאלות על דוגמא ש? אני יודע שיש הרבה דברים שונים קורה שם, הרבה דברים שלא ראינו לפני, אבל כמו כל דבר. כֵּן. קהל 1: האם יש לך לעשות שום דבר מיוחד לקרצף נתונים זה מגיע מהטופס? שמתי לב שאמרת "ליצור" עזרא זיגמונד: כן, אז זה למעשה, זה נקודה ממש טובה. אז השאלה הייתה, האם אתה צריך לבדוק ולוודא כי הנתונים הנו בתוקף, ו לעשות כל סוג של קרצוף כדי לוודא שזה חוקי, כי כפי שאתה יכול לראות כאן, אני לא עושה את זה. אז בואו לראות מה קורה אם אני שולח משהו ריק. אז, זה יהיה ממש פשוט לעשות הודעה וריקה למלא בDateTime. אז במציאות, אתה כנראה היית רוצה לעשות משהו כמו, אולי לציין אם הכותרת היא שווה ל המחרוזת הריקה, אז לא עושה את זה. או, רק לעשות את זה אם הכותרת היא לא שווה למחרוזת הריקה. כך שזה לא ממש באופן אוטומטי דואג לקרצוף ש בשבילך, כך שאתה עדיין צריך לעשות את זה. כן, שאלה טובה. קהל 2: האם זה לשפשף להזרקת המשך? את יודעת? עזרא זיגמונד: יש לקוות, פיווי עושה את זה. אני חושב שזה בהחלט יהיה יפה ספרייה רעה אם הוא לא עשה את זה. אני לא יודע בדיוק. הייתי צריך להסתכל על שאילתה שנוצר. אני חושב שאם אני הקלדתי ב פוסט בבלוג שנראה סוג של כמו התקפת הזרקת SQL, משהו כזה, אם זה הוא כמו שדה סיסמא או משהו, אתה יכול לעשות משהו כזה. אני חושב שעדיין יהיה לקבל פורסם פשוטו כמשמעו, אבל אני חושב שפיווי עושה איזה קרצוף של נתונים לפני שזה באמת מבצע אותו. קהל 1: זה שדה הטקסט הוא שנועד לקחת טקסט רגיל, נכון? עזרא זיגמונד: כן, זה הוא. כֵּן. אז אני חושב שכל, אז זה התנהגות נכונה, שתעשה את זה, אבל אני חושב שפיווי אני מקווה עושה לעשות איזה הגנה על הקצה שלהם. ואם אתה רוצה בדוק שיש דרכים כאשר אתה יוצר שאילתא. ולכן אין לך לבצע את זה באופן ישיר. הייתי צריך לקחת להסתכל תיעוד, אבל למעשה אתה יכול להציג את SQL שהוא מייצר, ותסתכל על זה, ולעשות בטוח שהוא נמלט דברים. סיבה נוספת למה אתה עשוי רוצה להסתכל על SQL פיווי שהפלט, הוא אם דברים נראים הולכים ממש לאט, אתה יכול להעיף מבט ולראות מה זה עושה בעצם, כי זה לפעמים קל להוסיף בטעות ב, הדרך שאתה כותב את זה, אתה יכול לקבל את זה בטעות בחר את מסד הנתונים כולו ראשון, ואז לעשות קצת פעולת מיון שב, כאשר אתה באמת אמור לבחור תת קבוצה. וכך, אם דברים אינם די הולך ימינה, זה טוב ליסתכל על הבקשה זה בעצם מקבל שנוצר. כֵּן. קהל 2: כאשר אתה ראשון התחיל, אתה שם בנמל כ5000. עזרא זיגמונד: כן. קהל 2: האם ברירת המחדל עם פיווי, או שזה משהו שאתה יכול לשנות? עזרא זיגמונד: כן, כל כך נמל הוא ברירת מחדל עם בקבוק. אם אתה מפעיל את זה בלי מפרט כל דבר, זה יהיה באופן אוטומטי לעשות את זה. אני מאמין, שאהיה לי להכפיל לבדוק את זה, אבל אתה יכול לציין כי בapp.run, אני חושב שאתה יכול לעשות משהו כזה, יציאה = 8080. בואו לתת שמנסה ממש מהר. כן, כך שאתה יכול רק לציין יציאה = 8080, וזה יפעל אותו שם, שאני חושב, אם אתה רוצה להפעיל אותו על IDE, אני לא ניסיתי את זה, אבל אני חושב שאם אתה ניהל אותו ביציאה 8080, אתה כנראה אהיה מסוגל כדי לגשת לשרת, בדיוק כמו שהייתם לאתר. כן, אבל זה קל כדי לשנות את זה אם אתה יש כל סוג של יציאה-העברה כמו דברים שאתה צריך לעשות. כל שאלות אחרות? כֵּן? קהל 1: אז, ראיתי בך דגמים ש, כפי שציינתם, אתה צריך לציין את מסד הנתונים עבור כל אובייקט. האם אתה יודע במקרה, עושה זה עושה את זה ממש קל אם אתה יש לי המון מאגרי SQLite ש רוצה להשתמש לאינטרנט אפליקציה אחת, כי אתה יכול רק לציין חבורה של אלה שונים במודל שלך? עזרא זיגמונד: כן, תן לי לפתוח שעד מהיר אמיתי. אז, אתה אומר, אם אתה רוצה להיות חבורה של משהו אחר, אולי אוהב והסטודנטים, עבור חלק סיבה, משהו כזה? כן, אז אני חושב ש אתה עדיין, כל דגם היה עדיין יש רק מסד נתונים אחד שהוקצה לה, אבל אם אתה רוצה יש לי מודלים שונים ש יש אובייקטי מסד נתונים שונים שהוקצו לזה, אתה יכול בהחלט לעשות את זה. לכן, אם אני יצרתי חדש, משהו כזה, ועכשיו זה הוא סטודנט ש נראה באופן מוזר כמו לכתוב בלוג, אני יכול לציין ש מסד הנתונים הוא שווה לdb_2 כאן. אז, אני חושב שזה הדרך העיקרית שאתה יכול לעשות את זה. מגניב. כל שאלות אחרות? אז רק כדי לסיים אותו קצת קצת, הנה כמה משאבים, ושקופיות אלה יפורסמו באינטרנט כך שאתה ממש יכול להגיע לקישורים אלה. המשאבים הטובים ביותר הם באמת בתיעוד של צפחת ופיווי עצמם. הם כתובים ממש טובים, אני חושב. אז, באתר האינטרנט של הבקבוק הוא כאן, ו יש להם הדרכה על התחלה מהירה ש יצעד דרך דומה דברים למה שהלכתי ב, אבל אם אתה רוצה כל סוג של ביקורת מהדברים שאני ניגשתי, או שחשבת שהסברתי משהו בדרך מבלבלת, תהיה להם דוגמאות דומות שם. יש פיווי תיעוד, ו יש להם הדרכה על התחלה מהירה שהולך על הפרמטרים העיקריים כי אתה רוצה להשתמש. אז, הדברים שדיברתי על עם ברירות מחדל הייחודיות, ומפרטים, הסוגים השונים של שדות ש אתה יכול להשתמש, אלה יהיו שם כולם. כמו כן, אם יש לך שאלות על פיווי, ושתפרסם אותם על StackOverflow, הבחור שעשה פיווי למעשה הולך והתשובות האלה לפעמים. אם יש לך שאלה, אני מקווה הוא יהיה מסוגל לענות עליה, כי הוא כתב את כל העניין. אני חושב שזה כל מה ש אני רוצה לכסות. תודה על שיצא.