[MUSIC CHƠI] Ezra ZIGMOND: Hi, tất cả mọi người. Cảm ơn vì đã đến ngày hôm nay. Hội thảo này là "Python Web Apps với Flask. " Vì vậy, tôi sẽ nói chuyện một chút về lý do tại sao bạn có thể muốn sử dụng để làm cho Flask ứng dụng web với Python, như trái ngược để một số khuôn khổ khác trên mạng, như Django, mà là nổi tiếng nhất. Phụ đề là "và Peewee, "đó là cái gì chúng ta sẽ nói về cách để tương tác với cơ sở dữ liệu SQL. Nó làm cho nó thực sự tốt đẹp. Vì vậy, đây chỉ là một tóm tắt nhanh chóng những gì tôi muốn đi qua. Vì vậy, đầu tiên, chỉ là một slide đó sẽ là quickstart, mà là làm thế nào để có được tất cả mọi thứ thiết lập trên máy tính của bạn. Tôi sẽ được chứng minh điều này trên máy Mac địa phương của tôi, chỉ vì đó là nơi tôi đã làm điều này trước đây, tôi cảm thấy thoải mái nhất với nó, nhưng điều này chắc chắn là có thể trên CD50 IDE. Vì vậy, sau đó, tôi muốn giới thiệu những gì Flask là, và thuyết phục bạn tại sao bạn nên sử dụng nó ở nơi đầu tiên. Sau đó, tôi sẽ cung cấp một cách nhanh chóng ví dụ về những gì bạn có thể làm trong Flask, một ví dụ nhanh về những gì bạn có thể làm trong Peewee, và sau đó tôi sẽ cho bạn thấy một nhiều hơn ứng dụng ví dụ hoàn chỉnh mà tôi đặt lại với nhau rằng chúng tôi có thể đi bộ qua lại với nhau. Và cuối cùng, trong slide cuối cùng, tôi có một số tài nguyên mà bạn nhìn tại trực tuyến để biết thêm thông tin. Đây không phải là một hoàn thành hướng dẫn về cách sử dụng Flask. Và tôi hy vọng sẽ để lại một số thời gian cho các câu hỏi. Bất cứ ai xem tại địa phương, chỉ như thế, hét to ở giữa nếu bạn có câu hỏi nào. Vì vậy, các công cụ cài đặt nhanh chóng, nếu bạn muốn theo cùng, hoặc nếu bạn muốn có được điều này up trên máy tính của riêng bạn, Tôi sẽ được sử dụng Python 2.7.10. Flask làm việc với Python 3, nhưng tôi thích sử dụng Python 2, bởi vì có một số gói Python không làm việc với 3 nào. Nếu bạn đã cài đặt pip, mà là một người quản lý gói Python, Tôi nghĩ rằng nếu bạn là Python lớn hơn hoặc bằng 2.7.9, bạn đã cài đặt trước đó, việc siêu dễ dàng để cài đặt các gói này. Bạn có thể cài đặt làm pip Flask, pip cài đặt Peewee, thường là bạn phải chạy sudo chỉ do đó các điều khoản làm việc ra. Và, nếu bạn đang sử dụng một siêu phiên bản cũ của Python, Tôi khuyên bạn nên cập nhật Python của bạn, hoặc sử dụng để cài đặt EasyInstall pip. Vì vậy, câu hỏi tiếp theo là, Flask là gì? Và tôi đoán, lần đầu tiên một câu hỏi hợp lý Tôi tự hỏi trong một thời gian dài là một ứng dụng web là gì? Bởi vì đó là một từ mà tôi nghĩ được ném xung quanh rất nhiều mà tôi thực sự không biết. Và tôi nghĩ rằng tốt nhất ví dụ về những gì một ứng dụng web là, thực sự là CS50 Tài chính, nơi nó không thực sự chỉ là một trang web, nhưng nó là một cái gì đó mà bạn thể loại tương tác với. Có tài khoản người dùng và tất cả các loại vật khác nhau. Vì vậy, chính xác nơi bạn vẽ ranh giới giữa một trang web là gì, và là những gì một ứng dụng web, được loại tùy ý, nhưng tôi đoán các ý tưởng, nó là một cái gì đó nhiều hơn một trang web và đó là một ứng dụng hữu ích. Vì vậy, Flask là một khuôn khổ cho làm cho các ứng dụng web bằng cách sử dụng Python. Và hy vọng rằng, bằng cách kết thúc điều này, tôi sẽ thuyết phục bạn mà bạn thực sự có thể viết một cái gì đó như CS50 Tài chính sử dụng Python, mà tôi như tốt hơn rất nhiều so với PHP, cá nhân. Vì vậy, Flask là, họ gọi một microframework, theo đó, họ có nghĩa là nó rất đơn giản, nhưng có thể mở rộng. Vì vậy, nó có chỉ là những gì bạn cần, nhưng nếu bạn muốn thêm nhiều tính năng, thật dễ dàng để mang lại cho họ. Nhưng chỉ vì đó là một microframework, không có nghĩa là nó chỉ cho các dự án nhỏ. Tôi có một liên kết ở đây mà nói rằng Obama sử dụng Flask trong năm 2012 cho chiến dịch của mình trang web, mà hy vọng, là một cái gì đó của một sự chứng thực. Nhưng điều mà tôi thực sự thích về Flask là, nó không thực sự làm bất kỳ loại quyết định cho bạn. Chỉ vì chúng tôi nói về các ứng dụng web, Tôi phải so sánh nó với Ruby on Rails và Django, cả hai là các khuôn khổ lớn, nhưng cả hai đều đưa ra giả định về cách bạn muốn tương tác với cơ sở dữ liệu, làm thế nào bạn muốn trình bày của bạn quan điểm, và họ chắc chắn khía cạnh tốt để đó. Ví dụ, Ruby on Rails có hệ thống ghi lại hoạt động này, mà là một thực sự tốt đẹp cách để tương tác với dữ liệu, nhưng nếu bạn muốn sử dụng Ruby on Rails, bạn đang loại gắn vào đó. Nhưng với Flask, như tôi sẽ chỉ cho bạn với Peewee, bạn có thể sử dụng bất cứ loại của cơ sở dữ liệu mà bạn muốn, và bạn chỉ có thể kéo mà trong như một phần mở rộng vào Flask. Vì vậy, đó là lý do tại sao tôi thực sự như Flask, đó là nó không làm cho các giả định cho bạn dựa vào những thứ bạn không cần phải thực sự. Vì vậy, tại sao bạn nên sử dụng Flask? Những lợi thế là, nó chỉ đã thực sự các tính năng cốt lõi xây dựng vào nó mà bạn cần. Vì vậy, bạn không phải lo lắng về hiểu một bó toàn bộ những thứ mà bạn không thực sự cần. Bạn không cần phải phải lo lắng về cách tắt tính năng mà bạn không thực sự cần. Và, như tôi đã đề cập, đó là siêu dễ dàng để thêm vào phần mở rộng của điều mà bạn cần. Một số trong số họ, có Flask hỗ trợ riêng của mình cho nó. Vì vậy, có một cái gì đó gọi là Flask admin, mà phản ánh admin panel rằng Django cung cấp, mang đến cho bạn một cách trực quan đẹp để quản lý trang web của bạn. Nhưng một lần nữa, nếu bạn làm một cái gì đó đơn giản, có thể bạn không cần một quản trị lớn bảng điều khiển, vì vậy tôi nghĩ rằng đó là siêu đẹp. Và những khó khăn là, mà bạn có ít năng lượng ra khỏi hộp. Vì vậy, khi bạn lần đầu tiên mở ra Flask, và trong chương trình Python của bạn, bạn chỉ cần gõ từ Flask nhập khẩu *, hoặc bất cứ điều gì, bạn không chính xác có được tất cả các các tính năng mà bạn có thể muốn. Và vì vậy bạn phải rõ ràng hơn danh sách các tính năng bạn muốn. Vì vậy, đó là một bất lợi, nhưng tôi nghĩ rằng để xây dựng web nhỏ các ứng dụng như tôi sẽ được hiển thị bạn, đó không phải là thực sự là một vấn đề. Và những gì là điều cuối cùng là phải nói, đó là một lỗi đánh máy, là có rất ít chuẩn ước cho cách sử dụng Flask, chỉ vì không có nhiều người sử dụng nó một cách chuyên nghiệp so với Django. Vì vậy, nếu bạn nhìn một cái gì đó như thế, "làm thế nào để tôi làm x" trong Django, có thể bạn sẽ tìm thấy nó. Có thiết kế tốt mẫu mà bạn có thể sử dụng, nhưng với Flask, nó loại đi theo cách riêng của bạn, chỉ vì nó là một thư viện khá nhỏ. Vì vậy, đó là những nhược điểm, nhưng tôi nghĩ rằng rằng nó vẫn là một thư viện tốt để sử dụng. Vì vậy, chúng ta hãy chỉ nhảy ngay vào Flask. Điều này chắc chắn sẽ không là một hướng dẫn đầy đủ, nhưng nó cung cấp cho bạn một ý tưởng làm thế nào để cấu trúc vật, và do đó, bạn cảm thấy thoải mái đi tắt và nhìn vào các tài liệu hướng dẫn và tìm hiểu thêm. Vì vậy, hãy để tôi mở ra một thực sự Ví dụ đơn giản lúc đầu, và cho bạn thấy những gì mà trông như thế, và sau đó chúng tôi sẽ phá vỡ nó xuống nhiều hơn một chút. Vì vậy, ở đây, hãy để tôi làm cho nó chạy. Vì vậy, bây giờ tôi có ứng dụng đang chạy của tôi. Tôi sẽ mở Safari, và nó đang chạy trên máy chủ địa phương của tôi. Vì vậy, tôi chỉ cần đi để làm cho lớn hơn. Nhưng localhost: 5000 Và như vậy, ngay bây giờ, tất cả điều này là, khi bạn truy cập các trang web, nó in ra "Hello Flask," mà không phải là siêu hữu ích, nhưng tôi nghĩ nó rất tuyệt đó trong tập tin này nhỏ ở đây, chúng tôi có một máy chủ web chạy được in ra một cái gì đó. Vì vậy, chúng ta hãy thực sự nhìn tại các mã cho một thứ hai, và phá vỡ nó xuống một chút. Là kích thước tốt cho tất cả mọi người ở đây? Vì vậy, hy vọng, bạn đang hơi thoải mái sử dụng Python. Tôi giả định rằng chúng ta có thể nhìn vào Python và đọc qua nó. Nếu bạn có bất kỳ câu hỏi về bất cứ điều gì, tôi cũng có thể đi qua đó. Vì vậy, dòng đầu tiên là, từ Flask, chúng tôi nhập khẩu, Flask với số vốn "F" được sắp xếp của tất cả các Các tính năng quan trọng mà bạn cần. Bất cứ khi nào bạn đang viết một tập tin và sử dụng Flask, bạn sẽ muốn nhập khẩu đó, chỉ vì đó có tất cả mọi thứ chính. Điều tiếp theo chúng ta làm, là chúng tôi gọi hàm Flask này, chỉ để tạo ra một đối tượng ứng dụng, và bạn luôn luôn muốn làm điều đó. Và sau đó, nhảy xuống đáy một cách nhanh chóng, điều này một phần ở đây là, 'if_name _ == "_ main_"' là sắp xếp của một ước Python. Vì vậy, đây sẽ chỉ thực hiện nếu bạn chạy file này trực tiếp bằng cách sử dụng Python. Sau đó, chúng ta gọi app.run, mà sẽ thực sự bắt đầu ứng dụng đi. Vì vậy, đó là cấu trúc chính mà bạn sẽ có trong bất kỳ ứng dụng Flask, là bạn sẽ có này app = Flask (_NAME_), và sau đó app.run. Vì vậy, hai điều mà tôi có ở đây, là những gì chúng ta gọi là các tuyến đường. Vì vậy, chúng ta hãy nói về định tuyến hơn một chút. Tôi sẽ quay trở lại slide. Vì vậy, cơ bản nhất khái niệm trong Flask được định tuyến. Và đó là ý tưởng mà bạn gán các chức năng trong Python đến các địa chỉ cụ thể trên trang web của bạn. Vì vậy, bất cứ khi nào bạn muốn để tạo ra một con đường mới, bạn sử dụng @ này app.route chức năng trang trí. Vì vậy, nếu bạn không quen với trang trí chức năng trong Python, đó là khái niệm này mà cho phép bạn có một chức năng và bao quanh nó với cái gì khác. Vì vậy, thực sự, những gì trang trí này không có gì, là nó mất chức năng bên dưới nó, và nó cho biết thêm nhiều thông tin với nó, nhưng những gì thực sự Flask không làm cho điều đó xảy ra không phải là siêu rất quan trọng, nhưng những gì là quan trọng, là trước khi các tuyến đường, bạn đặt @ này app.route, và sau đó địa chỉ của các tuyến đường, do đó, các dấu gạch chéo là những gì chúng tôi thấy khi chúng ta chỉ cần mở trang web. Vì vậy, đó là trang chủ. Nó chỉ là những đường gạch chéo. Và sau đó bạn có chức năng này. Tên của hàm có thể là bất cứ điều gì bạn muốn. Nó không phải nhất thiết phải làm gì với các tuyến đường. Và sau đó, bất cứ điều gì của trả lại chức năng, chức năng phải trả lại một chuỗi. Và chuỗi mà có thể chứa HTML hoặc bất cứ điều gì, và đó thực sự là những gì sẽ nhận trả lại cho trình duyệt web của bạn như là HTML, và nó sẽ làm điều đó. Vì vậy, đây là cùng một mã đó là từ các ví dụ mà tôi chỉ cần chạy, vì vậy khi chúng tôi ghé thăm dấu gạch chéo, nó gọi một hàm Hello World, mà chỉ cần trả về một chuỗi, Hello Flask, và đó được in trên màn hình. Vì vậy, có một ví dụ khác, đó là, khi bạn truy cập / hello, nó in ra Xin chào Lời, thực sự nên nói, Hello World, nhưng chúng ta hãy giả vờ đó là cố ý. Vì vậy, hãy kéo mà lên thật nhanh. Vì vậy, nếu bạn đi đến localhost / hello, nó bây giờ sẽ in một cái gì đó khác. Vì vậy, đó chỉ là một ví dụ nhanh chóng như thế nào bạn có thể tạo ra hai con đường khác nhau. Vì vậy, cho đến nay đây không phải là siêu hữu ích, có không phải là một toàn bộ rất nhiều bạn có thể làm, bạn chỉ có thể làm tất cả những gì có có các trang HTML khác nhau, và khi bạn ghé thăm một cụ thể trang nó chỉ nạp trang. Vì vậy, chúng ta hãy xem một số chi tiết những điều hữu ích mà bạn có thể làm. Vì vậy, có một điều mà bạn có thể có nhận thấy trong các ví dụ mà tôi kéo lên, là tôi đã app.run (debug = True). Và như vậy, cái gì đây Lập luận debug có, là rằng khi bạn chạy máy chủ web của bạn, khi bạn đang ở trong ứng dụng của bạn, nếu bạn thay đổi một tập tin, nó sẽ tự động tải lại các máy chủ. Và do đó bạn không thực sự phải khởi động lại Python, mà là siêu hữu ích. Tôi có thể thấy. Hãy để tôi kéo lên mã của tôi với các lỗi chính tả trong nó, và giả vờ typo đã được đặt ở đó cố ý mang tính hướng dẫn. Vì vậy, hãy thêm điều này trở lại trong. Vì vậy, bây giờ nó nói Hello World. Tôi sẽ lưu nó. Và nếu chúng ta kéo trở lại lên các thiết bị đầu cuối, bạn sẽ nói rằng nó khởi động lại, bởi vì nó phát hiện ra một sự thay đổi, và vì vậy bây giờ khi chúng ta cần nạp trang này, nó sẽ in ra những điều đúng. Vì vậy, debug là siêu hữu ích cho điều đó. Ngoài ra, nếu bạn có bất kỳ sắp xếp của một vụ tai nạn, vì vậy hãy để tôi làm crash ứng dụng này bằng cách để nó không trả về một chuỗi. Vì vậy, chúng ta hãy chỉ cần có nó Không quay trở lại đối với một số lý do. Và sau đó khi tôi truy cập này trang, nó sẽ chỉ sụp đổ, nhưng máy chủ không chỉ sụp đổ, nó thực sự mang đến cho bạn một sao siêu hữu ích dấu vết của tất cả mọi thứ mà đi sai. Và những gì thực sự tốt đẹp, được mà tại bất cứ bước nào trong dấu vết trở lại này, bạn có thể mở ra một tương tác vỏ ở đây, và loại in ra những gì biến mà bạn muốn để có một cái nhìn tại. Và do đó, gỡ lỗi thực sự là hữu ích cho việc tìm ra những gì đang xảy ra với bạn máy chủ, thay vì chỉ nhìn thấy một cái gì đó trong PHP như một nội bộ 500 lỗi máy chủ, mà là siêu vô dụng. Một điều cần phải nhận thức, là rằng nếu bạn đặt ứng dụng trực tuyến của bạn do đó, nó hiển thị công khai, bạn không bao giờ muốn rời khỏi chế độ gỡ lỗi trên, bởi vì mọi người có thể thực sự sử dụng giao diện điều khiển mà tôi cho thấy bạn thực thi mã tùy ý. Vì vậy, họ có thể in ra giống như bất kỳ mã số bí mật mà bạn có trong đó, họ có thể xem xét chính xác làm thế nào trang web của bạn đang làm việc. Vì vậy, nó thực sự hữu ích để thử nghiệm, nhưng luôn luôn làm cho chắc chắn để đưa nó ra trước khi bạn xuất bản bất cứ điều gì trực tuyến. Vì vậy, khi bạn đang sử dụng một cái gì đó như PHP, có ý tưởng này rằng bạn có thể vượt qua thông tin giữa các trang web bằng cách đưa các thông tin thực trong URL, đó là một yêu cầu GET, nhưng trong Flask, bạn có thể thực sự làm điều gì đó đại loại như thế, bởi có một tuyến đường mà có một biến như là một phần của nó. Vì vậy, nếu bạn nhìn vào điều này Ví dụ trên màn hình ở đây, chúng ta có một con đường đó là ('/ hello /'), và như vậy, nếu bạn truy cập / hello / cái gì đó, một điều gì đó sẽ thực sự có được đầy vào biến tên. Và nhận thấy rằng các chức năng mà đi kèm với con đường đó đã để mất trong tham số tên, do đó nó sẽ thực sự có được thông qua vào hàm. Và sau đó, một khi bạn đang bên trong của chức năng đó, bạn có thể coi đó như Python một biến bình thường, và như vậy sau đó, nó sẽ in ra Xin chào, và nó sẽ điền tên sử dụng một số chuỗi định dạng. Vì vậy, để thêm phần biến với một định tuyến, bạn sử dụng khung góc đánh dấu. Và tùy chọn, bạn có thể sử dụng những gì được gọi là một công cụ chuyển đổi. Và như vậy, nếu bạn đặt này chú thích với đại tràng, bạn có thể xác định rằng đó là một int, hoặc một phao, hay đường dẫn, và nó sẽ tự động chuyển đổi đó. Bạn cũng có thể làm việc chuyển đổi trong phạm vi chức năng Python, chỉ bằng cách sử dụng một diễn viên, nhưng đôi khi nếu bạn muốn đảm bảo rằng nó là một int, bạn có thể đặt một quy tắc chuyển đổi trong đó. Vì vậy, hãy kéo lên một ví dụ của một số quy tắc biến. Vì vậy, ở đây, điều này có cùng cơ bản cấu trúc với các từ Flask nhập khẩu Flask, ứng dụng = Flask (_NAME_), và sau đó nó đang chạy ở cuối. Chúng tôi có hai khác nhau tuyến đường biến ở đây. Và một trong những đầu tiên, là cái mà tôi thấy trong slide, đó là nó chỉ mất trong một chuỗi tên và nó sẽ in ra Xin chào, Tên. Và sau đó, thứ hai có ai sử dụng các chuyển đổi. Vì vậy, đây sẽ tự động chuyển đổi nó đến một int, và sau đó tăng gấp đôi int, và in mà ra. Và, chúng ta không làm bất kỳ loại chuyển biến trong nó vì Flask chăm sóc đó. Vì vậy, hãy chạy này. Khi bạn có một Flask ứng dụng đang chạy, bạn có thể kiểm soát-C ra khỏi nó để ngăn chặn các máy chủ đang chạy. Và sau đó tôi sẽ chạy biến. Vì vậy, chúng ta hãy đi đến localhost / hello / Ezra và hy vọng, điều này sẽ nói lời chào với tôi. Vì vậy, nó mất tên của tôi, trong biến tuyến đường, và nó đầy nó ở đây. Vì vậy, tôi cũng sẽ hiển thị một cách nhanh chóng ví dụ về tăng gấp đôi. Vì vậy, nếu bạn đi đến / đôi / 3, nó sẽ in ra 6. Vì vậy, đây đã chăm sóc việc chuyển đổi đối với chúng tôi. Vì vậy, bạn cũng có thể làm điều đó với float, và một cái gì đó đặc biệt, nếu bạn cần phải chỉ định một cái gì đó như một con đường, cho phép nó chấp nhận chém, nhưng đó không phải là một vấn đề thường. Vì vậy, đến nay chúng tôi, vẫn còn có chỉ được trả lại dây, mà không phải là rất thú vị. Chúng tôi thực sự có thể trở lại chuỗi HTML đen. Vì vậy, trong các đoạn mã chúng ta có thể chèn một cái gì đó như b-thẻ để làm cho nó đậm, nhưng hầu hết thời gian bạn không thực sự muốn là văn bản HTML trong mã Python của bạn. Nó được thực sự lộn xộn, và nó không phải là một thời gian tốt. Flask cho phép chúng ta tách ra HTML vào những gì được gọi là Template, và do đó, nếu bạn đang suy nghĩ về mô hình MVC rằng bạn đã quen thuộc với, hy vọng, từ làm việc với CS50 Tài chính một chút, bạn có thể nghĩ về các tập tin Python như đang được nhiều điều khiển, nơi họ đang tương tác với bất cứ điều gì mô hình dữ liệu bạn có thể có. Và sau đó chúng được gọi ra để đọc và chuyển thông tin cho rằng Xem để điền vào các thông tin trong HTML mà nó cần. Và những gì chúng ta gọi là những người đọc là mẫu trong lớp học. Vì vậy, Flask sử dụng Python khác mô-đun đó nó sẽ tự động cài đặt khi bạn cài đặt pips Flask gọi Jinja, mà cho phép bạn thêm những chú thích vào HTML mà bạn nhìn thấy trên màn hình, cho phép bạn đưa vào những thứ như điều kiện, và vòng vào HTML. Vì vậy, nó trông giống một chút như thế nào bạn có thể sử dụng PHP trong một tập tin HTML, nhưng điều này chỉ khi Flask máy chủ phục vụ lên các tập tin HTML, nó sẽ chạy công cụ khuôn mẫu này và phân tích thông qua điều này và điền vào những điều trong. Vì vậy, Flask có một chức năng render_template mà bạn có thể nhìn thấy ở phía dưới đây. Và như vậy khi bạn ghé thăm trang này, nó sẽ làm cho Template hello.html này, và sau đó điền vào trang HTML này. Vì vậy, chúng ta hãy chỉ cần chạy thật này nhanh chóng, và xem những gì nó trông giống như, và sau đó tôi sẽ đi qua một chút chút chi tiết hơn. Vì vậy, Templates của bạn đang đi để đi trong một thư mục Templates. Nó sẽ tự động tìm trong Mẫu thư mục dành cho Bản mẫu đó. Vì vậy, chúng ta hãy mở này lên. Vì vậy, tôi sẽ chạy ví dụ khuôn mẫu. Vì vậy, nếu tôi đi đến / hello / Ezra, nó có khủng khiếp này, tag marquee đáng ghét mà tôi đặt trong. Rất đẹp, rất năng động. Tôi là một fan hâm mộ lớn. Nhưng những gì sẽ xảy ra nếu Tôi chỉ cần đi đến, / hello? Vì vậy, nó chỉ nói Hello World. Tôi đã không vượt qua nó một cái tên, và nó đầy nó tự động. Vì vậy, chúng ta hãy xem làm thế nào nó đã làm điều đó, và làm thế nào chúng ta có thể thoát khỏi marquee rằng có thể. Vì vậy, ở đây, đây là loại một ví dụ thú vị về, nếu bạn đã quen thuộc với cách chuyển đổi báo cáo hoạt động trong một ngôn ngữ. Nói điều này là loại giống như, mà sắp xếp của một mùa thu qua, nơi bạn thực sự gắn hai đường khác nhau để cùng chức năng. Vì vậy, chúng tôi đính kèm / hello tuyến đường và các / hello / route tên Xin chào, và chúng tôi chỉ định using-- Python giúp bạn xác định chức năng mặc định arguments-- vì vậy nếu không có tên, vì vậy nếu chúng ta đi chỉ / hello, nó sẽ tự động lọc tên bằng None. Vì vậy, sau đó, chúng tôi làm cho Template với tên = tên, do đó, nó sẽ vượt qua trong các tham số tên với các tham số chức năng tên này, vào Mẫu. Mà vẫn không giải thích thế nào là quyết định xem có in Hello World, hoặc in tên của tôi. Vì vậy, hãy thực sự nhìn vào các mẫu tự, và nhìn thấy nơi đó là đến từ. Vì vậy, trong bản này, chúng tôi thực sự có một số logic có điều kiện, mà một số người sẽ tranh luận, bạn thực sự không nên có rất nhiều điều kiện logic trong Template của bạn chính nó. Nó nên được nhiều hơn trong Controller, nhưng trong ví dụ này nó là một cái gì đó khá nhỏ. Vì vậy, ở đây, chúng tôi kiểm tra, nếu tên, vì vậy nếu tên không bằng None, nếu một tên thực sự là thông qua tại, sau đó chúng tôi sẽ nói Xin chào, tên với tiêu đề và vùng lựa chọn, tất cả HTML bình thường này, nếu không, chúng ta sẽ in ra Hello, World chỉ bình thường. Vì vậy, một vài điều cần chú ý ở đây về cách bạn định dạng các khuôn mẫu, là, tất cả các câu điều kiện, loại giống như cách chúng tôi PHP nó khi bạn muốn chèn một số PHP, bạn sử dụng ít hơn so với câu hỏi đánh dấu, nó là loại tương tự ở đây với {%. Vì vậy, ở đây, chúng ta có mã điều kiện của chúng tôi. Và sau đó, khi bạn thực sự muốn nghĩa là đánh giá một cái gì đó, và in ấn nó ra màn hình, bạn sử dụng dấu ngoặc kép. Vì vậy, đây là những dấu ngoặc kép, và sau đó chúng tôi ghi rõ tên, vì vậy trong đó, nó sẽ đánh giá để tên biến, mà đã được thông qua từ làm mẫu hàm, thay vì chỉ in ấn ra, nếu chúng ta đã thoát khỏi những, nó sẽ chỉ in ra từ "cái tên." Vì vậy, đó là một cái gì đó để xem ra cho. Vì vậy, một điều để thông báo là, khi chúng ta muốn sử dụng chức năng render_template, chúng tôi thực sự phải nhập khẩu nó một cách rõ ràng từ Flask. Và đây là một ví dụ về các mô đun của Flask, rằng bạn không phải nhập khẩu những điều mà bạn không cần. Bạn chỉ có thể mang lại chức năng bạn thực sự không cần, mà đôi khi tốt đẹp, do đó bạn không phải có tất cả các chức năng này ngồi xung quanh mà bạn không sử dụng, nhưng cũng có thể, nếu bạn quên rằng bạn cần phải nhập khẩu render_template, có thể bạn sẽ nhận được một cảnh báo mà sẽ cho bạn biết về điều đó. Vì vậy, đó là khuôn mẫu. Vì vậy, chúng tôi cho thấy làm thế nào để làm cho các trang web đơn giản, và thêm logic hơn một chút để nó, trong điều kiện của định tuyến biến. Nó cho phép bạn làm những điều khác nhau dựa trên những gì URL bạn đi đến, và cũng sau đó, cung cấp cho ý thức HTML hơn một chút trong về làm thế nào bạn muốn làm việc. Bạn không cần phải đặt tất cả HTML của bạn trong Python của bạn, nhưng đối với khá nhiều mọi ứng dụng web, bạn sẽ muốn một số loại của mô hình dữ liệu liên kết với nó. Và do đó, theo truyền thống, điều này sẽ là một cái gì đó giống như một cơ sở dữ liệu SQL. Và bạn chỉ có thể tương tác trực tiếp với SQL. Python có, tôi nghĩ rằng nó được gọi là. SQLite 3. Bạn chỉ có thể nhập SQLite 3 và thực hiện truy vấn SQL trực tiếp, nhưng tôi không biết về bạn, nhưng tôi thực sự không thích, chỉ, viết ra các truy vấn SQL. Nó có xu hướng để có được thực sự lâu dài và phức tạp. Và như vậy, một cái gì đó Tôi muốn sử dụng là gì được biết đến như một ORM, mà là một đối tượng quan hệ lập bản đồ. Và quan điểm của một đối tượng quan hệ lập bản đồ, là có hai khác nhau cách bạn có thể suy nghĩ về cơ sở dữ liệu. Vì vậy, ví dụ mà Giáo sư Malan thường sử dụng trong lớp học, là bảng Excel, nơi bạn có các hàng và các cột, và đó là thực sự hữu ích cho làm thế nào nó được đại diện trong SQL và cách bạn tương tác với nó, nhưng một cách khác mà nó thực sự hữu ích để suy nghĩ về nó đôi khi, là về các lớp học và các đối tượng. Vì vậy, thay vì suy nghĩ của mỗi bảng là có hàng này có số thông tin, bạn có thể thực sự nghĩ về nó như là mỗi bảng là một lớp học, và sau đó mỗi thể hiện của Lớp học có tính chất nhất định. Vì vậy, trong ví dụ này, các trường hợp của lớp học là các hàng trong bảng, và sau đó mỗi tài sản sẽ là một cột trong bảng. Vì vậy, các ORM mà tôi thích để sử dụng được gọi là Peewee. Nó thực sự nhỏ, loại giống như Flask. Tôi nghĩ rằng họ cũng đi cùng nhau, nhưng có rất nhiều ORMs khác mà bạn có thể sử dụng. Một trong những phổ biến hơn là được gọi là SQLAlchemy, và tôi không thể nhớ tại sao tôi ban đầu chọn Peewee hơn SQLAlchemy, hoặc tôi sẽ cho bạn biết lý do tại sao tôi nghĩ rằng đó là một trong những tốt nhất, nhưng chúng tôi sẽ chỉ sử dụng này một vì tôi biết làm thế nào để sử dụng nó. Vì vậy, một câu hỏi là, tại sao bạn phải bận tâm bằng cách sử dụng một ORM, thay vì chỉ trực tiếp viết các truy vấn SQL? Và tôi nghĩ rằng trường hợp tốt nhất, là bạn không thực sự phải viết các truy vấn SQL. Nó dễ dàng hơn nhiều, như tôi sẽ chỉ cho bạn, để làm những việc như lựa chọn, chèn, xóa, đặc biệt là việc tạo bảng. Nó dễ dàng hơn nhiều để viết một cấu trúc lớp, hơn là để cơ cấu Tạo Bảng báo cáo, nhưng có một điều để được nhận thức, là ORM sẽ cố gắng tốt nhất của mình để tìm ra những gì nhiều nhất truy vấn SQL hiệu quả sẽ là, nhưng đôi khi nó được nó sai. Và đặc biệt là nếu bạn đang làm việc với một cơ sở dữ liệu lớn, bạn có thể nhận thấy rằng một truy vấn mà nên chạy nhanh, thực sự là mất nhiều thời gian. Và nếu bạn nhìn dưới mui xe như thế nào ORM được giải thích rằng vào SQL, nó có thể làm điều gì đó thực sự vô lý, chỉ vì nó loại ra hiệu ý định của bạn sai. Và, đã có lần, nơi Tôi đã có để ghi đè lên nó, và chỉ thực hiện truy vấn SQL của riêng tôi, chỉ bởi vì nó đã được phân tích một cách kỳ lạ. Vì vậy, có một số trên không, chỉ trong cách mà nó biên dịch của bạn báo cáo thành SQL. Vì vậy, chúng ta hãy nhìn siêu nhanh tại một ví dụ đơn giản của một mô hình dữ liệu mà bạn có thể sử dụng. Vì vậy, đây là mã Python, và do đó Điều đầu tiên bạn muốn làm là từ Peewee nhập khẩu *. Vì vậy, không giống như Flask, nơi bạn có tất cả các mô-đun riêng, và bạn muốn nhập khẩu Flask, và viết một mẫu, và một số người khác rằng chúng ta sẽ thấy sau này, từ Peewee, bạn chỉ có thể nhập tất cả mọi thứ, bởi vì nó là một thư viện khá nhỏ. Vì vậy, điều đầu tiên bạn muốn làm, là thực sự tạo ra đối tượng cơ sở dữ liệu này. Vì vậy, bạn có db = SqliteDatabase, và sau đó là tên của cơ sở dữ liệu của bạn. Và điều này sẽ thực sự tạo ra một đối tượng cơ sở dữ liệu mà bạn có thể tương tác với, với Peewee. Và sau đó, chúng tôi có thực tế mô hình mà chúng tôi muốn tạo ra. Vì vậy, bàn chúng tôi muốn tạo ra. Vì vậy, trong vòng Peewee, mỗi lớp có bảng riêng của mình trong cơ sở dữ liệu của bạn. Vì vậy, tất cả các lớp học kế thừa từ các mô hình cơ sở, và mô hình vốn M là cái gì mà được định nghĩa trong Peewee. Vì vậy, tất cả các mô hình của bạn nên kế thừa như lớp cha cao nhất của họ, họ nên thừa hưởng từ mô hình, nhưng những gì là thực sự mát mẻ, là bạn thực sự có thể có của bạn mô hình kế thừa từ mỗi khác. Và rất nhiều thời gian, bạn mô hình dữ liệu không nhất thiết làm cho một hệ thống phân cấp thừa kế đẹp, nhưng lần, nơi họ làm, nó thực sự tốt đẹp, bởi vì bạn có mô hình vốn có từ mỗi khác. Vì vậy, chúng ta định nghĩa lớp này 'học sinh,' mà sẽ thừa kế một mô hình, và nó có ba đặc tính. Nó có một ID, đó là một PrimaryKeyField, mà là một cái gì đó là cung cấp bởi Peewee, tên là một CharField, và một lớp là một IntegerField. Vì vậy, điều này có thể hoặc không thể được cách CS50 thực sự lưu trữ tất cả lớp của học sinh. Nó là không, nhưng đây là cách tôi sẽ làm điều đó. Và sau đó nó có, trong vòng lớp này, và điều này là một cái gì đó bạn có thể làm với Python, bạn có thể có các lớp lồng nhau. Và đây là một cái gì đó đó là cần thiết bởi Peewee. Vì vậy, lớp Meta này, bạn có để xác định rằng các cơ sở dữ liệu là bằng với đối tượng mà chúng ta đã tạo ở trên. Và điều này nói gì là tập tin bảng này thực sự sẽ được chứa trong. Vì vậy, đây là một cái gì đó mà bạn có làm trong tất cả các mô hình của bạn. Bạn chỉ cần có để xác định trong lớp Meta này cơ sở dữ liệu đó là bằng db. Vì vậy, những gì tôi thường làm, nếu tôi có một loạt các mô hình khác nhau, là tôi có một cơ sở mô hình, mà tôi thường chỉ cần gọi "mô hình cơ sở" có lớp Meta, và nó đặt cơ sở dữ liệu bằng db. Và sau đó tất cả các mô hình tiếp theo của tôi sẽ kế thừa từ lớp cơ sở đó. Và sau đó tôi không phải lo lắng về việc thiết lập các lớp Meta. Vì vậy, khi điều này thực sự được biên soạn thành một câu lệnh SQL, có vẻ như điều này khó chịu xuống ở đây, "Tạo bảng thẻ sinh viên số nguyên, " bất cứ điều gì. Và, tôi nghĩ rằng nó là ngắn hơn, truy vấn SQL này ngay tại đây, nhưng nếu bạn nhìn vào lớp học này ở đây bạn có thể thấy chính xác những gì đang xảy ra. Bạn có thể xem những gì các loại của các lĩnh vực có, những gì họ đang được gọi là, và như vậy, tôi nghĩ rằng nhìn vào mã Python này là rất nhiều độc giả tìm đọc hơn cố gắng để viết truy vấn SQL này. Vì vậy, để thực sự sử dụng cơ sở dữ liệu, chúng ta phải kết nối với nó trong Python. Vì vậy, tôi thường viết một chức năng gọi là initialize_db rằng không có hai điều. Nó có trong cơ sở dữ liệu đối tượng db và nó kết nối đến nó, mà chỉ mở lên phần cơ sở dữ liệu. Nếu bạn chỉ cần chạy mặc dù trang web trên máy tính địa phương của bạn, nó không phải là một việc siêu lớn lo lắng về kết nối và ngắt kết nối, nhưng nếu bạn đang chạy nó trên một trang web, bạn muốn chắc chắn rằng, bất cứ khi nào người dùng kết nối đến nó, khi họ đóng các trang web, họ ngắt kết nối để bạn không có một bó của những người kết nối cơ sở dữ liệu của bạn cùng một lúc. Và sau đó, khi bạn kết nối với cơ sở dữ liệu, bạn muốn gọi db.create_tables, và danh sách các mô hình cho những gì bạn muốn để tạo bảng. Vì vậy, ở đây, tôi chỉ muốn tạo ra nó cho học sinh này. Và sau đó, những gì quan trọng, là định an toàn = True hầu hết thời gian. Vì vậy, những gì tuyên bố này sẽ làm gì, là nó tạo bảng biểu cho mô hình học sinh, nhưng chỉ nếu bảng có không được tạo ra rồi. Đó là những gì các quy định cụ thể an toàn. Vì vậy, nó sẽ không ghi đè lên bảng hiện tại của bạn, nó sẽ chỉ tạo ra một mới bàn nếu không có ai ở đó. Vì vậy, bạn chỉ có thể tạo ra các bảng một lần sử dụng SQL. Và sau đó có mà ngồi cơ sở dữ liệu ở đó, và sau đó kết nối với nhau thời gian, nhưng nó thường là tốt đẹp chỉ để đặt trong cuộc gọi create_tables này, do đó, nếu bạn đã bao giờ xóa của bạn cơ sở dữ liệu khi bạn chạy web của bạn ứng dụng một lần nữa, nó sẽ tạo lại nó. Vì vậy, chỉ cần đảm bảo rằng an toàn được xác định là True, hoặc bạn sẽ tìm thấy dữ liệu của bạn chỉ nhận clobbered mỗi lần. Và sau đó, bạn chỉ có thể gọi initialize_db thành lập một kết nối, và tạo bảng nếu cần thiết. Vì vậy, điều phổ biến nhất mà bạn sẽ muốn làm, hoặc một trong những điều phổ biến nhất, là để thực sự chèn thứ vào cơ sở dữ liệu của bạn. Và như vậy, thay vì phải để viết một chèn INTO tuyên bố với tất cả các các giá trị quy định, bạn thực sự có thể gọi chức năng trên lớp của học sinh. Vì vậy, khi bạn tạo một lớp mà kế thừa từ mô hình, nó có tạo ra phương pháp này. Vì vậy, bạn làm lớp name.create, và bạn chỉ định các thông số mà bạn muốn vượt qua trong. Vì vậy, nếu tôi muốn thêm một số sinh viên cho ví dụ cuốn sách lớp CS50 của chúng tôi, Tôi sẽ đưa David, người đã có một lớp rất tốt, ông đã có một 95. Và bản thân mình, những người không phải làm rất tốt trong CS50, tôi có một 50. Và như vậy, những điều tốt đẹp về những gì tạo ra điều này chức năng nào, là nó trả về một thể hiện, hoặc hàng, mà nó tạo ra trong bảng, và như vậy thì bạn lưu trữ trong một biến, và làm việc với nó sau này. Bạn có thể thay đổi xung quanh, mà Tôi sẽ đưa ra một ví dụ về. Chú ý rằng tôi đã không phải xác định ID, vì kể từ khi nó là PrimaryKeyField, nó sẽ tự động tăng nó nếu bạn không xác định nó. Và, trên thực tế, có thể bạn không nên xác định nó, bởi vì bạn có thể vô tình clobber ID của người khác. Và bạn muốn chắc chắc chắn rằng nó là duy nhất. Vì vậy, trên thực tế, hầu hết các điều phổ biến mà bạn muốn làm, có lẽ là chọn ra của cơ sở dữ liệu một khi bạn có rất nhiều thông tin trong đó. Và như vậy, nếu bạn muốn để có được tất cả mọi thứ, vì vậy tương đương với việc chọn sao từ sinh viên tuyên bố, nó sẽ chỉ được student.select. Và điều đó sẽ cho bạn trở lại một mảng với tất cả các sinh viên các đối tượng trong nó rằng bạn lặp qua bạn muốn. Bạn có thể nhận được những việc làm của nó. Và hầu hết thời gian, bạn không chỉ muốn làm lựa chọn, bạn thực sự muốn chỉ định một cái gì đó. Và như vậy, bạn có thể chuỗi cùng các cuộc gọi chức năng, giống như cách bạn làm chuỗi cùng các báo cáo trong SQL. Vì vậy, bạn có thể làm student.select (). Nơi trong ví dụ này. Và sau đó, bạn có thể cụ thể điều kiện, chỉ sử dụng Python bình thường Boolean để kiểm tra mọi thứ. Vì vậy, trong trường hợp này, bạn muốn hạn chế những gì bạn đang chọn để, nơi student.grade bằng 50, và student.name bằng Ezra, do đó sẽ chỉ làm cho tôi ra khỏi nó. Và hãy chú ý, ai thực sự điều tinh tế ở đây là rằng, nếu bạn muốn chỉ định một và / hoặc và một hoặc / hay, trong Python, bạn sẽ thường sử dụng, Tôi nghĩ rằng từ "và" thực sự, nhưng ở đây bạn sử dụng các ký hiệu duy nhất, thường là một nhà điều hành Bitwise, nhưng trong trường hợp đặc biệt này, chỉ cách các Peewee hiện nó, bạn sử dụng duy nhất ký hiệu để xác định "và". Đó là một cái gì đó Tôi có được hỗn hợp lên rất nhiều, nhưng nó không đi lên mà nhiều trong thực tế. Và sau đó, một khi bạn có tất cả các học sinh ra khỏi cơ sở dữ liệu, một khi bạn đã làm bạn chọn và mặc của bạn hoặc bất cứ điều gì, bạn có thể sử dụng một vòng lặp foreach, chỉ như bình thường trong Python, với bất kỳ loại iterator hoặc với bất kỳ loại của mảng. Vì vậy, bạn có thể làm, cho s trong student.select () whe. re (Student.grade <75), và do đó, điều này sẽ lặp qua mỗi học sinh trong bảng mà lớp ít hơn 75, trong trường hợp này, vẫn chỉ là tôi. Và sau đó bạn có thể làm một cái gì đó trong vòng loop rằng, giống như gửi cho tôi một email và cho tôi biết để thực sự biến trong Vấn đề của tôi Sets. Vì vậy, một điều bạn có thể làm, là nó thực sự dễ dàng để cập nhật các hàng trong bảng. Vì vậy, hãy nhớ lại ở đây, của bạn khi tôi đưa vào, Tôi lấy giá trị đó là trả về bởi student.create, và tôi giao nó cho tên gọi là Ezra. Và vì vậy bây giờ, bạn có thể thay đổi các giá trị trong trường hợp đó, giống như bạn làm một lớp học bình thường trong Python. Vì vậy, bạn có thể thiết lập ezra.grade = 95 và rằng sẽ cập nhật các bản sao địa phương, nhưng nếu bạn thực sự muốn cam kết thay đổi đó đến cơ sở dữ liệu, bạn phải gọi ezra.save, do đó, bạn gọi là phương pháp .save trên dụ. Và vì vậy bây giờ, tôi đã thay đổi thành công lớp riêng của tôi trong các cơ sở dữ liệu. Vì vậy, sau đó chúng ta hãy nói rằng tôi bị bắt thay đổi lớp của tôi trong các cơ sở dữ liệu. Giáo sư Malan có lẽ sẽ muốn xóa tôi ra khỏi lớp, và do đó bạn có thể gọi .delete phương pháp dụ chỉ về điều đó. Vì vậy, nếu bạn muốn đi trở lại vào vòng lặp này ở đây, và thực sự, thay vì gửi email tất cả của sinh viên mà lớp ít hơn 75, bạn muốn xóa chúng, trong vòng lặp này, bạn có thể gọi dụ s.delete. Và điều cuối cùng bạn muốn làm, là bất cứ khi nào bạn thiết lập kết nối, và bạn đang thực hiện với công việc của bạn, bạn muốn gọi db.close, nơi db là cơ sở dữ liệu đối tượng mà chúng ta có trước. Và bạn muốn chắc chắn rằng mọi thứ sẽ được đóng cửa ra của. Mát. Vì vậy, bây giờ, tôi có một ứng dụng ví dụ. Tôi đã sắp xếp trước khi thực hiện tất cả mọi thứ chỉ do đó sẽ không có bất kỳ mã hóa trực tiếp những sai lầm, nhưng chúng ta có thể đi bộ qua nó và xem làm thế nào bạn sẽ đặt Flask và Peewee với nhau, và làm cho một ứng dụng đơn giản. Tôi gọi nó là CS50 rant, và nó sắp xếp của một nền tảng blog đơn giản. Vì vậy, lần đầu tiên, tôi sẽ chạy nó và hiển thị những gì nó trông giống như, và sau đó chúng ta có thể xem xét thêm vào các mã. Được rồi, vậy chúng ta hãy chỉ chạy này. Cool, tôi sẽ thực hiện điều này một chút nhỏ hơn. Nó không phải rất khá, chỉ vì Tôi đã không làm cho rất nhiều CSS, nhưng những gì nó là, nó có cơ sở dữ liệu này của bài đăng trên blog, và nó đi qua tất cả họ, và nó sẽ hiển thị chúng trên các trang theo thứ tự gần đây nhất. Và do đó, đây chỉ là một số bài viết mà tôi đã được lưu trong cơ sở dữ liệu. Vì vậy, nếu chúng ta muốn tạo ra một mới bài, chúng ta có thể đi đến Thêm một bài viết mới, và chúng tôi có thể nhập tiêu đề của bài, nên cái gì như, CS50 hội thảo. Wow, thực sự thưởng thức các buổi hội thảo. Mát. Sau đó, bạn nhấn môn, nó sẽ chuyển hướng bạn trở lại trang chủ, và sau đó bạn sẽ thấy rằng bài viết mới nhất đã được bổ sung. Và chúng tôi vẫn có tất cả những cái đó. Vì vậy, bây giờ, chúng ta hãy bước qua tất cả các mã và xem cách này được thực hiện. Vì vậy, tôi nghĩ rằng điều đầu tiên mà chúng ta hãy xem, thực sự là mô hình. Rất nhiều thời gian, khi bạn đang thiết kế một cái gì đó, bạn muốn suy nghĩ đầu tiên về cách bạn đang đi để đại diện cho dữ liệu của bạn, và sau đó thiết kế những thứ xung quanh đó, vì vậy mà tất cả mọi thứ có ý nghĩa. Và đó thực sự là như thế nào tôi đã làm nó khi tôi đã làm điều này, Tôi ngồi xuống và suy nghĩ, những gì tôi muốn trong một bài đăng. Vì vậy, ở đây, chúng ta có cùng một cấu trúc mà tôi đã đề cập trước đó, nơi chúng tôi làm db = Sqldatabase ('posts.db'). Trong thực tế, có thể bạn không muốn mã cứng trong cơ sở dữ liệu tên của bạn. Điều đó có lẽ phải là một tham số đó là lưu trữ ở đâu, có lẽ trong một tập tin cấu hình, nhưng trong một ví dụ nhỏ như thế này, nó okay để mã cứng trong. Vì vậy, bây giờ, chúng tôi có lớp học bài này, mà kế thừa từ các mô hình cơ sở. Và nó có, một lần nữa, ID = PrimaryKeyField. Trên thực tế, nếu bạn không xác định, nếu tôi thực sự đã thoát khỏi điều này, sau đó Peewee chúng tôi sẽ chăm sóc tự động tạo mà trường ID, và nó sẽ tự động làm cho nó một PrimaryKey, mà Tôi nghĩ là thực sự tốt đẹp, bởi vì thông thường, đó là điều mà bạn muốn có, nhưng tôi muốn đặt nó vào cụ thể, chỉ để tôi nhớ rằng nó ở trong đó. Nhưng nếu bạn không xác định rằng, rằng sẽ có tự động. Vì vậy, sau đó, tôi có một ngày mà là một DateTimeField, và tất cả các lĩnh vực khác nhau, nếu bạn xem xét các tài liệu Peewee, nó sẽ cung cấp cho bạn một danh sách khác nhau kiểu của các trường mà bạn có thể sử dụng. Đối với hầu hết các phần, có sự tương những gì bạn sẽ thấy trong SQL. Vì vậy, có một CharField, một VarCharFields, textfields, mà là cho rất dài văn bản, giống như một bài viết trên blog tiềm năng, DateTimeFields, DoubleFields, FloatFields, tất cả những điều như thế. Và bạn có thể vượt qua trong lập luận khác với nó, mà tôi đã không chỉ định ở đây. Say, ví dụ, bạn không muốn cho phép hai bài viết có cùng tên, bạn có thể chỉ định một cái gì đó giống như độc đáo = True, và đó chỉ là một tham số phụ để lĩnh vực mà khi nó biên dịch nó xuống vào SQL, nó sẽ chỉ định rằng nó phải là duy nhất. Bạn cũng có thể chỉ định một cái gì đó như không null và tất cả những thứ khác bạn thường làm gì trong SQL. Vì vậy, đây là một khá đơn giản mô hình nào có ngày tháng. Chú ý ở đây, trong DateTimeField, Tôi đã chỉ định những gì mặc định là. Tôi chỉ định nó là datetime.datetime.now, vì cách mà điều này được đánh giá, nó thực sự đánh giá các DateTime.Now khi nó được chèn vào cơ sở dữ liệu. Tôi nghĩ rằng, tôi muốn có để kiểm tra này, nhưng nếu bạn đã làm một cái gì đó như thế này, sau đó nó thực sự sẽ đánh giá rằng một khi, và sau đó là DateTime sẽ luôn luôn như nhau. Vì vậy, chỉ cần nếu bạn đang làm gì đó với datetimes, kiểm tra lại mà nó đánh giá khi thực sự được đưa vào, hoặc người nào khác bạn có thể bị nhầm lẫn. Các danh hiệu chỉ là một CharField, trong đó có có nhiều thông số, bạn có thể vượt qua quy định cụ thể chính xác bao lâu bạn muốn nó được, nhưng ở đây, nó không thực sự quan trọng. Và văn bản là có được các văn bản của toàn bài, và đó sẽ là một TextField chỉ vì bạn muốn để cho phép nó là một chuỗi khá dài. Sau đó, chúng tôi có Meta này lớp con chỉ quy định cụ thể mà chúng tôi muốn các cơ sở dữ liệu nơi này là thực sự mở ra vào là đối tượng db mà chúng ta có ở đây. Và điều cuối cùng chúng ta có ở đây, chỉ là chức năng này rằng chúng ta sẽ sử dụng từ ứng dụng chính của chúng tôi để khởi tạo cơ sở dữ liệu để kết nối với nó, và sau đó tạo ra các bảng Post. Bây giờ, chúng ta hãy nhìn vào các ứng dụng chính bản thân. Vì vậy, đây là một trong khá chút còn hơn những người mà chúng ta đã thấy trước đây, nhưng hy vọng không quá xấu. Vì vậy, hãy để tôi mở rộng này ra. Đuợc. Vì vậy, hãy chú ý và đầu tôi nhập khẩu một bó toàn bộ những thứ khác từ Flask rằng chúng ta có không thực sự thấy trước đây. Và hy vọng, chúng ta có thể đi qua mỗi một trong số những cái một và nói thêm một chút về họ, được sắp xếp theo ví dụ. Vì vậy, chúng tôi có các Flask, và render_template, mà chúng ta đã thấy trước đây, yêu cầu đối tượng này, mà sẽ đi lên khi chúng ta nhìn vào như thế nào các hình thức mà tôi đã thấy thực sự công trinh. Chuyển hướng, cho phép bạn chuyển hướng trở lại từ Create New Post sao cho các trang web ban đầu, và sau đó URL, đó là một cái gì đó cho phép bạn tìm ra nơi trên trang web một trang cụ thể là. Vì vậy, sau đó, tiếp theo điều tôi làm, là tôi nhập khẩu tất cả các thông tin từ các mô hình các tập tin mà chúng tôi chỉ nhìn vào. Và, yeah. Vì vậy, cái gì khác mới mà đi lên khi bạn đang làm việc với, đặc biệt là cơ sở dữ liệu, là bạn có thể chỉ định một chức năng mà được gọi là trước mọi yêu cầu, và chức năng mà được gọi là sau mỗi yêu cầu, sử dụng này yêu cầu chức năng trang trí app.before. Và điều này sẽ được thực thi bất cứ nơi nào chức năng này. Điều này không phải là gọi là trước khi yêu cầu, nhưng thường đó là một cái gì đó hợp lý để gọi nó. Bạn có thể chỉ định bất cứ chức năng bạn muốn để có được gọi là có, vì vậy tôi chỉ định initialize_db này chức năng mà chúng tôi đã trở lại trong các mô hình tập tin, vì vậy trước mỗi yêu cầu, bạn muốn kết nối tới cơ sở dữ liệu. Có hai khác nhau cách bạn có thể làm điều này. Bạn có thể làmapp., I tin rằng đó là after_request. Và sự khác biệt giữa after_request và teardown_request, là after_request sẽ chỉ xảy ra nếu yêu cầu thực sự là hợp lệ. Và như vậy, chỉ khi yêu cầu đã thành công, nếu không có gì sai, nhưng teardown_request xảy ra trong trường hợp của một thành công yêu cầu, hoặc trong trường hợp có lỗi. Vì vậy, thông thường, bạn muốn sử dụng teardown_request, trừ khi bạn muốn làm một cái gì đó, đặc biệt là khác nhau trong trường hợp có lỗi. Nhưng chỉ để đóng các cơ sở dữ liệu, cho dù đó là thành công hay nếu nó không thành công, chúng tôi làm bạn muốn ngắt kết nối từ các cơ sở dữ liệu. Vì vậy, nó được gọi là, db.close trên đối tượng db. Chú ý rằng các teardown_request mất trong một ngoại lệ. Vì vậy, bạn có thể kiểm tra xem có thực sự một lỗi khi nó đã được đóng cửa, nhưng ở đây, hy vọng, có không phải là một toàn bộ rất nhiều sai sót, vì vậy chúng ta chỉ cần loại bỏ qua mà. Được rồi, và phần còn lại của nó không phải là quá xấu. Vì vậy, khi chúng tôi đi đến trang chủ, chúng tôi trả lại Template home.html này mà sẽ mở ra. Quả là trong bài viết bằng, và điều này không được, nhớ là chúng tôi có bài viết này mô hình, vì vậy chúng tôi chọn tất cả các bài viết, và sau đó một điều bạn có thể làm, bạn có thể chỉ định các mệnh đề WHERE, bạn có thể chỉ định một đặt hàng bằng cách, và vì vậy chúng tôi tất cả các bài viết mà được chọn, và sau đó chúng ra lệnh cho họ bởi post.date.descending. Và điều đó sẽ chỉ định, khi họ thực sự đi ra, một trong những gần đây nhất sẽ là một đầu tiên. Và sau đó, chúng tôi đi qua đó vào các mẫu home.html, vì vậy chúng ta hãy thực sự mở ra rằng Template thực sự nhanh chóng, và hãy xem làm thế nào mà làm việc. Và đây không phải là HTML tuyệt vời, nhưng hy vọng, chúng ta có thể tập trung vào Python. Vì vậy, có một liên kết đến các Add New Post, và vì vậy điều này quy định các tuyến đường trong Flask rằng chúng tôi xác định, đó là quyền ở đây. Đây là con đường bài mới, và chúng tôi xác định rằng ở đây. Và đó là một liên kết mà sau đó sẽ đi cho rằng tuyến đường trong máy chủ Flask. Điều thú vị hơn là điều này cho vòng lặp ở đây. Vì vậy, chúng tôi xác định rằng điều này Tham số bài mà đã được thông qua vào chức năng render_template, cho mỗi bài viết trong bài viết của đối tượng mà được thông qua trong. Chúng tôi muốn in ra tiêu đề bài viết, trong H1, và sau đó dưới đây, chúng tôi muốn in ra các văn bản đăng bài trong một đoạn văn. Và ở đây, chúng ta có thể thực sự gọi một hàm Python, vì vậy chúng tôi có thể gọi strftime, ST-RF-thời gian, và bạn có thể vượt qua trong chuỗi định dạng mà bạn muốn in các dữ liệu ra vào. Vì vậy, nó là khá tốt đẹp mà bạn có thể thực sự gọi chức năng này Python từ bên trong ở đây. Bạn không cần phải làm các định dạng trên bên điều khiển, bởi vì thực sự, định dạng ngày tháng là một cái gì đó bạn muốn để đối phó trong các View. Và tất cả những phần trăm điều quan trọng không phải là siêu. Nếu bạn tìm kiếm các tài liệu hướng dẫn cho các chức năng strftime trong Python, nó xác định tất cả các thứ, nhưng mà của như thế nào, khi chúng tôi đang tìm kiếm tại trang chủ ở đây, nó định dạng này với một tốt đẹp ngày, và nó xác định AM hoặc PM, nhưng bình thường, nếu chúng tôi không có điều này ở đây, có thể bạn sẽ nhận được một số rác ngày mà không nhìn rất tốt. Và sau đó chúng tôi chỉ định post.text, và tôi có thể đã đặt một vài ngắt dòng ở đây, chỉ cần để đặt một số không gian giữa mỗi bài. Vì vậy, tôi nghĩ quan trọng nhất điều trong ví dụ này, là bạn có thể sử dụng cho vòng lặp. Và điều này là tương tự những điều bạn có thể làm trong PHP. Bạn có thể lặp qua, mọi thứ sẽ được thông qua tại, và như vậy, thay vì phải làm sao chép / dán, sao chép / dán tất cả các HTML, bạn chỉ cần phải viết nó một lần, và sau đó bạn có thể duyệt qua tất cả các bài viết. Và đây là một cái gì đó phổ biến mà bạn muốn để làm gì, khi bạn có rất nhiều dữ liệu, là cho tất cả mọi thứ trong dữ liệu của bạn, bạn muốn làm một điều tương tự. Và sau đó, chỉ cần nhớ rằng, khi bạn muốn in ra một cái gì đó một cách rõ ràng trong HTML, bạn sử dụng trong dấu ngoặc kép ở đây, nhưng sau đó khi bạn muốn chỉ định một số thông tin về điều kiện, hoặc về một vòng lặp for, bạn sử dụng khung phần trăm. Vì vậy, đi lại cho các Python mã, do đó giải thích những gì đang xảy ra trong chính tuyến đường, khi chúng tôi đến đó, nó chỉ hiển thị tất cả các bài viết, nhưng sau đó câu hỏi là, làm thế nào chúng ta thực sự có được gửi vào cơ sở dữ liệu, mà là thú vị hơn một chút. Vì vậy, khi bạn click vào New Post link, mà chúng tôi đã nhìn thấy ở đây, nó chuyển hướng bạn đến mẫu này. Và đó chỉ là một cuộc gọi đơn giản đến chức năng render_template, mà sau đó đi qua các bài viết mới ở dạng HTML. Vì vậy, chúng ta hãy nhìn vào đó. Vì vậy, một điều này là khá đơn giản. Nó có một form HTML đơn giản, sẽ xem xét một chút quen thuộc, dựa trên các hình thức trong CS50 Tài chính. Và như vậy, chúng tôi chỉ định ở đây, các hành động. Và ở đây, nếu bạn đang làm việc với PHP, bình thường, nó sẽ là một cái gì đó như thế, create.PHP, nhưng ở đây chúng tôi thực sự xác định một lộ trình trong máy chủ Flask. Và như vậy, tương ứng với tuyến đường này các tuyến đường tạo mà chúng ta có ở đây, mà chúng ta sẽ đi vào trong một giây. Và như vậy, chúng tôi xác định rằng đó là một phương pháp bài, bởi vì chúng tôi muốn gửi này form dữ liệu, và thường khi bạn đang gửi dữ liệu từ một hình thức, bạn có thể muốn sử dụng một yêu cầu bài, chỉ để bạn không kết thúc với lớn, khó sử dụng URL này. Nhưng bạn cũng có thể sử dụng một yêu cầu GET, và vượt qua nó với định tuyến biến, nhưng đối với các hình thức, nó là tốt đẹp một yêu cầu bài viết ở đây. Và như vậy thì, giống như bạn sẽ làm gì với HTML và PHP, bạn có thể chỉ định các yếu tố đầu vào văn bản, và bạn có thể chỉ định tên của họ, và đó là tên mà sẽ được thông qua vào đối tượng yêu cầu trong vòng Flask. Và sau đó, chúng tôi đã một Submit nút nói rằng bài viết. Và ở đây, bài viết là tên của nút, bởi vì đó là một bài đăng blog, nhưng ở đây, bài viết là phương pháp yêu cầu. Vì vậy, những người đang có cùng một từ nhưng thực sự không liên quan. Vâng Trở lại với các mã Python, khi chúng ta gọi là phương pháp tạo ra, ý ở đây là bạn có thể thực sự chỉ định trong các tuyến đường các phương pháp theo yêu cầu mà bạn muốn chấp nhận, và vì vậy ở đây, tôi xác định rằng tôi chỉ muốn chấp nhận một phương pháp Post. Vì vậy, nếu tôi thực sự cố gắng để truy cập vào trang trực tiếp, đó là sử dụng một yêu cầu GET, nó sẽ cho tôi biết "Phương pháp không cho phép." Và như vậy, bạn có các trang, loại giống như này tạo trang, mà tôi chỉ là thực sự sử dụng như là một cách cho các hình thức để gửi, bạn có thể chỉ định rằng bạn không muốn mọi người có thể đến đó trực tiếp thông qua một yêu cầu GET, hoặc nếu bạn không muốn, đối với một số lý do, một yêu cầu Post, bạn chỉ có thể chỉ định GET đây, nhưng trong ví dụ này, chúng ta chỉ muốn yêu cầu bài viết để đi ra ngoài. Vì vậy, khi create_post được gọi là, khi chúng tôi ghé thăm đó thông qua các yêu cầu Post, bất cứ khi nào bạn đi đến một cụ thể tuyến đường, có đối tượng yêu cầu này, và chúng ta phải nhập khẩu yêu cầu ở trên đỉnh, nhưng có yêu cầu này đối tượng mà được thông qua tại, và bạn có thể truy cập các dữ liệu mẫu, đó sẽ tự động được điền khi bạn gửi một yêu cầu từ một hình thức. Và sau đó, những gì tôi nghĩ là thực sự mát mẻ, được rằng các đối tượng hình thức để có được thông qua trong, chỉ là một từ điển Python chứa, nếu bạn access-- như vậy ở đây, chúng ta hãy tôi kéo lên HTML bên cạnh nó, chỉ vì vậy bạn có thể có mà như một tài liệu tham khảo, có, do đó các tên mà chúng tôi chỉ định ở đây cho các lĩnh vực khác nhau, vì vậy tiêu đề và văn bản, chúng tôi sau đó chỉ cần sử dụng những người trên đây như chỉ số sang các dữ liệu mẫu. Vì vậy, đó là siêu thuận tiện. Vì vậy, sau đó chúng ta gọi post.create, mà sẽ tạo ra và tự động chèn bài này đối tượng mới vào cơ sở dữ liệu. Và tôi nghĩ rằng điều này tạo ra chức năng đây là một ví dụ thực sự mát mẻ như thế nào mạnh mẽ Flask được và làm việc với điều này, bởi vì nếu bạn đang làm gì đó trong PHP, bạn có thể phải làm rất nhiều xác nhận, bạn sẽ phải sau đó thiết lập một kết nối cơ sở dữ liệu, bạn sẽ phải sau đó thực hiện truy vấn SQL, nhưng ở đây chúng tôi chỉ có này đẹp post.create, mà chúng tôi có thể sau đó chỉ có được các thông tin ra của các đối tượng yêu cầu, và sau đó vượt qua nó vào một mới đăng bài mà chúng tôi đang tạo. Và sau đó, cuối cùng Điều chúng tôi muốn làm, là để chuyển hướng người dùng trở lại nhà. Và vì vậy chúng tôi sử dụng này Flask chuyển hướng chức năng. Và cái gì mà chúng tôi đã không nhìn thấy trước, là chức năng URL này. Vì vậy, các URL cho chức năng cho phép bạn vượt qua trong thực sự là tên của một hàm trong mã Python của bạn, chứ không phải là các tuyến đường cụ thể rằng nó ở. Vì vậy, tôi có thể chỉ là một cách dễ dàng chuyển hướng người dùng để giảm, mà sẽ gửi nó trở về nhà, nhưng sử dụng các URL cho chức năng là tốt đẹp, bởi vì nếu bạn thay đổi vị trí nơi mà mọi thứ, vì vậy chúng ta hãy nói rằng tôi thay đổi nhà để ở / home thay vào đó, điều này sẽ vẫn còn sau đó trở về / home, vì thực sự đi và nhìn lên tên của các chức năng, và nó sẽ cung cấp cho bạn sao lưu các URL cho điều đó. Vì vậy, loại trên Giả định rằng bạn đang nhiều khả năng để thay đổi nơi mà mọi thứ là, so với tên của các chức năng. Bạn có thể sử dụng điều này thực sự URL đẹp cho hàm. Và một điều cần phải nhận thức được đó là một chút khó khăn, là bạn nghĩ rằng bạn chỉ có thể gọi chuyển hướng vào các URL cho, nhưng thực ra tất cả các tuyến đường có để lại một số loại văn bản và HTML, do đó, bạn thực sự phải trở lại cuộc gọi chuyển hướng. Nếu không, bạn sẽ nhận được một cái gì đó không hợp lệ về việc không trả lại một chuỗi, bởi vì tất cả trong số này có quay trở lại HTML mà bạn thực sự muốn làm. Và như vậy, khi bạn gọi chuyển hướng, nó chuyển hướng bạn đến trang, nhưng nó thực sự trả về HTML bạn cần phải thực hiện chuyển hướng đó. Quay trở lại trang chủ. Vì vậy, chúng tôi có hai quan điểm khác nhau. Chúng tôi có quan điểm về nhà. Hoặc, tôi đoán tôi nên nói mẫu. Chúng tôi có hai mẫu này, mẫu nhà mà hiển thị tất cả các bài viết của chúng tôi, và sau đó chúng tôi có điều quảng cáo này, và khi bạn nhấp vào bài viết, nó đi vào một tuyến đường mới trong Flask, nhưng con đường đó không nhất thiết phải có một mẫu tương ứng. Bạn không cần phải để xem bất cứ điều gì, nhưng bạn vẫn có thể có công việc này đi đằng sau hậu trường. Và sau đó bạn có được chuyển sao vào trang chủ. Và chắc chắn, thật dễ dàng để làm việc trong một số CSS đẹp hơn vào các mẫu và thực hiện điều này trông đẹp hơn rất nhiều, nhưng tất cả các logic chính là có trong Python. Bất kỳ câu hỏi về ví dụ đó? Tôi biết có rất nhiều những điều khác nhau xảy ra ở đó, rất nhiều điều chúng ta chưa từng thấy trước, nhưng cũng giống như bất cứ điều gì. Yeah. Đung 1: Bạn phải làm bất cứ điều gì đặc biệt để chà các dữ liệu đó là đến từ các hình thức? Tôi nhận thấy bạn chỉ cần nói "tạo ra" Ezra ZIGMOND: Yeah, vì vậy đó là trên thực tế, đó là một điểm thực sự tốt. Vì vậy, câu hỏi là, làm bạn cần phải kiểm tra và đảm bảo rằng các dữ liệu có giá trị, và làm bất kỳ loại chà để đảm bảo rằng nó là hợp lệ, bởi vì khi bạn có thể thấy ở đây, Tôi không làm điều đó. Vì vậy, chúng ta hãy xem những gì sẽ xảy ra nếu tôi gửi một cái gì đó trống. Vì vậy, nó thực sự sẽ chỉ làm cho một bài trống và điền vào các DateTime. Vì vậy, trong thực tế, bạn có lẽ sẽ muốn làm một cái gì đó như thế, có thể xác định nếu tiêu đề bằng các chuỗi rỗng, sau đó không làm điều này. Hoặc, chỉ làm điều đó nếu tiêu đề là không bằng chuỗi rỗng. Vì vậy, nó không thực sự tự động chăm sóc chà là cho bạn, vì vậy bạn vẫn cần phải làm điều đó. Vâng, câu hỏi hay. Đung 2: Liệu nó chà tiêm phần tiếp theo? Bạn có biết? Ezra ZIGMOND: Hy vọng rằng, Peewee nào đó. Tôi nghĩ chắc chắn nó sẽ là một khá thư viện xấu nếu nó đã không làm điều đó. Tôi không biết chính xác. Tôi sẽ phải nhìn vào truy vấn mà nó tạo ra. Tôi nghĩ rằng, nếu tôi gõ trong một bài viết trên blog rằng loại nhìn giống như một cuộc tấn công SQL injection, một cái gì đó như thế này, nếu điều này giống như một lĩnh vực mật khẩu hoặc một cái gì đó, bạn có thể làm một cái gì đó như thế này. Tôi nghĩ rằng sẽ vẫn còn có nghĩa là đăng, nhưng tôi nghĩ rằng Peewee không làm một số loại cọ của dữ liệu trước khi nó thực sự thực hiện nó. Đung 1: Đó là lĩnh vực văn bản thiết kế để lấy văn bản đơn giản, phải không? Ezra ZIGMOND: Vâng, đúng vậy. Yeah. Vì vậy, tôi nghĩ rằng tất cả các, vì vậy đây là hành vi đúng, mà sẽ làm điều đó, nhưng tôi nghĩ rằng Peewee hy vọng không làm một số loại bảo vệ vào cuối cùng của họ. Và nếu bạn muốn kiểm tra xem hai, có nhiều cách khi bạn tạo ra một truy vấn. vì vậy bạn không cần phải thực hiện nó trực tiếp. Tôi sẽ phải mất một nhìn vào tài liệu hướng dẫn, nhưng bạn thực sự có thể xem SQL mà nó được tạo ra, và hãy nhìn vào đó, và làm cho chắc chắn rằng nó được thoát khỏi mọi thứ. Một lý do khác có lẽ bạn muốn nhìn vào SQL Peewee được xuất ra, là nếu thứ dường như được đi thật chậm, bạn có thể có một cái nhìn và xem những gì nó thực sự làm, vì nó đôi khi dễ vô tình thêm trong, cách bạn viết nó, bạn có thể vô tình có nó chọn toàn bộ cơ sở dữ liệu đầu tiên, và sau đó làm một số hoạt động phân loại vào đó, khi bạn thực sự có nghĩa là để chọn một tập hợp con. Và như vậy, nếu mọi thứ không khá đi bên phải, nó là tốt để có một cái nhìn theo yêu cầu đó là thực tế nhận được tạo ra. Yeah. Đung 2: Khi bạn lần đầu tiên bắt đầu, bạn đưa vào các cảng như 5000. Ezra ZIGMOND: Yeah. Đung 2: là mặc định với Peewee, hay là cái gì đó bạn có thể thay đổi? Ezra ZIGMOND: Có, vì vậy các cổng là mặc định với Flask. Nếu bạn chạy nó mà không xác định bất cứ điều gì, nó sẽ tự động làm điều đó. Tôi tin rằng, tôi muốn có để kiểm tra này, nhưng bạn có thể chỉ định rằng trong app.run, Tôi nghĩ rằng bạn có thể làm một cái gì đó như thế, port = 8080. Hãy cung cấp cho rằng một thử thực sự nhanh chóng. Yeah, vì vậy bạn chỉ có thể xác định port = 8080, và nó sẽ chạy nó ở đó, mà tôi nghĩ rằng, nếu bạn muốn chạy nó trên IDE, tôi đã không cố gắng này ra, nhưng tôi nghĩ rằng nếu bạn chạy nó trên cổng 8080, bạn có thể muốn được thể để truy cập vào máy chủ, giống như bạn đã cho trang web. Yeah, nhưng nó dễ dàng để thay đổi điều đó nếu bạn có bất kỳ loại như port-forwarding những điều mà bạn cần phải làm. Bất kỳ câu hỏi khác? Yeah? Đung 1: Vì vậy, tôi đã thấy trong bạn các mô hình, như bạn đã đề cập, bạn phải xác định cơ sở dữ liệu cho từng đối tượng. Bạn có xảy ra cho biết, hiện mà làm cho nó thực sự dễ dàng nếu bạn có rất nhiều cơ sở dữ liệu SQLite mà bạn muốn sử dụng cho một ứng dụng web duy nhất, mà bạn chỉ có thể chỉ định một bó của những người khác nhau trong mô hình của bạn? Ezra ZIGMOND: Vâng, hãy để tôi mở mà lên thật nhanh. Vì vậy, bạn đang nói, nếu bạn muốn có một bó của một cái gì đó khác nhau, có thể thích và các sinh viên, đối với một số Lý do, một cái gì đó như thế? Yeah, vì vậy tôi nghĩ rằng bạn vẫn còn, mỗi mô hình sẽ phải vẫn có chỉ một cơ sở dữ liệu được gán cho nó, nhưng nếu bạn muốn có mô hình khác nhau mà đã đối tượng cơ sở dữ liệu khác nhau được giao với nó, bạn chắc chắn có thể làm điều đó. Vì vậy, nếu tôi tạo ra một mới, một cái gì đó như thế này, và giờ đây là một sinh viên mà trông kỳ quặc như một bài đăng blog, Tôi có thể xác định rằng các cơ sở dữ liệu bằng db_2 đây. Vì vậy, tôi nghĩ rằng đó là Cách chính bạn có thể làm điều đó. Mát. Bất kỳ câu hỏi khác? Vì vậy, chỉ để kết thúc lên một chút bit, đây là một số tài nguyên, và các slide sẽ được đăng trực tuyến vì vậy bạn có thể thực sự có được những liên kết này. Các nguồn lực tốt nhất là thực sự tài liệu cho Flask và Peewee mình. Họ đang viết thực sự tốt, tôi nghĩ. Vì vậy, các trang web Flask là ở đây, và họ có một quickstart hướng dẫn, sẽ đi qua tương tự điều gì, tôi bước qua, nhưng nếu bạn muốn bất kỳ loại xét trong những điều mà tôi đã đi qua, hoặc bạn nghĩ rằng tôi đã giải thích một cái gì đó một cách khó hiểu, họ sẽ có những ví dụ tương tự ở đó. Peewee có tài liệu, và họ có một quickstart hướng dẫn mà đi qua các thông số chính mà bạn muốn sử dụng. Vì vậy, những điều tôi đã nói chuyện về với giá trị mặc định độc đáo và quy định cụ thể, các loại khác nhau của các lĩnh vực mà bạn có thể sử dụng, tất cả những người sẽ ở đó. Ngoài ra, nếu bạn có câu hỏi về Peewee, và bạn gửi cho họ trên stackoverflow, anh chàng người làm Peewee thực đi và trả lời những đôi. Nếu bạn có một câu hỏi, hy vọng ông sẽ có thể trả lời nó, bởi vì ông đã viết toàn bộ điều. Tôi nghĩ rằng đó là tất cả mọi thứ Tôi muốn để trang trải. Thanks for sắp ra.