Hướng dẫn python import on demand - python nhập khẩu theo yêu cầu
Vấn đề trừu tượngLàm thế nào để nhập tốt nhất một gói có thể hoặc không thể nhập thành công trong quá trình chạy chương trình Tkinter, giả sử trên một nút nhấn. Show Hiện tại tôi đang sử dụng:
Đây có phải là cách tốt nhất để đi về nó? Có vấn đề gì với việc nhập các gói trong một cuộc gọi chức năng không? Vấn đề cụ thểTôi đang sử dụng CiruitPython để liên lạc với bảng MCP2221 nhưng nhập chỉ hoạt động nếu bảng được kết nối. Tôi muốn chương trình vẫn hoạt động nếu bảng không được kết nối và một cách để người dùng kết nối bảng sau khi chương trình bắt đầu. Mã cụ thể:
Cụ thể 0 và 1 sẽ không nhập nếu không có bảng được phát hiện nên tôi đã chuyển mã này từ nơi tất cả các nhập khẩu khác vào chức năng sẽ khởi tạo tất cả các phần cứng. Giới thiệu Django - Khởi tạo projectSơ qua về DjangoDjango là một Framework lập trình web bậc cao được viết bằng ngôn ngữ lập trình Python.Django nhanh và đơn giản giúp chúng ta có thể lập trình web trong thời gian ngắn. Ngoài ra, Django còn có tài liệu rất tốt, cộng đồng Django đông và lớn mạnh. Nó tuân theo nguyên tắc DRY (Don't repeat yourself - Đừng lặp lại chính mình), trong khi những Framework khác lại không coi trọng điều này. Django cũng hỗ trợ ORM (Object Relistic Mapping) Mô hình MTV pattern:
Để code Django, chúng ta phải cài đặt được Python. Bạn có thể cài đặt Python và Pip ở hướng dẫn này, đây là hướng dẫn cài đặt với Ubuntu và mình cũng sẽ code trên hệ điều hành Ubuntu. Phiên bản Python mình sử dụng là Python 3.7, các bạn cũng có thể cài đặt Python với các phiên bản 2 khác.Khởi tạo projectViệc đầu tiên là cài đặt môi trường ảo để phát triển dự án, có rất nhiều thư viện python có thể làm được điều này từ virtualenv đến pipenv. Để thuận tiện, mình sử dụng luôn pipenv để triển khai cài đặt. Ta chạy lệnh 3Tiếp theo là tạo folder chứa project và chạy môi trường ảo:
Lúc này, command line có dạng 4 tức là chúng ta đang trong môi trường ảo là 5.Tạo code project với lệnh 6. Lệnh này sẽ tạo tất cả code cần có cho 1 project Django ban đầu, mình thêm dấu 7 vào cuối, sẽ hơi khác so với thông thường khi không có dấu 7
Lúc này, command line sẽ xuất hiện 1 đường dẫn http://127.0.0.1:8000/ và chúng ta truy cập vào đường dẫn này sẽ có dạng: Cấu trúc thư mục của project:
Kết nối với MySQLMỗi Framework lập trình web nào cũng cần phải có cơ sở dữ liệu để quản lý dữ liệu người dùng. Nhìn thoáng qua file 9 và kéo xuống phần 0:
Ở đây, mặc định thì Django đang sử dụng hệ quản trị CSDL là sqlite3 cũng chính vì thế khi bạn chạy lệnh migrate bên trên, folder code sẽ tự tạo file 1. Django hỗ trợ rất nhiều hệ quản trị CSDL phổ biến cả sql lẫn nosql, chính vì thế mình sẽ sử dụng luôn MySQL làm hệ quản trị CSDL thay cho sqlite3.Để sử dụng được MySQL, chúng ta có thể cài đặt MySQL ở đây, bạn chỉ cần làm đến bước 2 là đủ rồi. Ngoài ra, để thuận tiên cho quản lý MySQL bằng giao diện, bạn có thể cài luôn MySQL Workbench ở đây. Còn nữa, chúng ta cũng cần phải cài đặt thư viện 3 để Python kết nối đến MySQl bằng lệnh 4Mình chỉnh sửa lại code 0 trong file 6 1 chút:
Thế là xong, bạn chạy lại lệnh 7, nếu command line không báo lỗi thì chúng ta đã kết nối thành công, lúc này bạn có thể xóa file 8 rồi.Để tên database và pasword thế này thì hớ hênh quá, chúng ta phải tạo thêm biến 9 để không bị lộ những thứ cá nhân thế này và những thứ khác sau này cũng thế. Thư viện Python cần cài đặt tiếp đó là 0, sau đó bạn tạo luôn file 1 cùng cấp với 2 với nội dung:
Trong file 6 bạn phải có thêm:
và bạn chỉ cần thay những thứ tương ứng từ file 1 vào:
Chúng ta lại chạy lại câu lênh 5 và 6 như bên trên, nếu không có lỗi gì thì ổn rồi.Docker cho projectTa thoát khỏi môi trường ảo trong phần 1 bằng lệnh 7, tạo 2 file Dockerfile và docker-compose.yml: 0Nội dung file Dockerfile như sau: 1Các nội dung này khá quen thuộc với người dùng Docker thường xuyên nên mình cũng không giải thích code nữa. Nội dung file docker-compose.yml như sau: 2Ở file 8 này, chúng ta tạo 2 container là web (để chạy ứng dụng web của chúng ta) và db (để chạy phần cơ sở dữ liệu MySQL)Bạn cần chú ý, giá trị của 9 phải là tên container cơ sở dữ liệu (db). Trong container db chứa image có tên 0 tức là phải là phiên bản MySQl trong máy chúng ta, giá trị volumes bắt đầu với 1 cũng phải tương ứng với tên container, giá trị ports bạn phải đặt thành 2 ( 3 không phải là 3306 để không bị trùng port). Cả 2 container phải có giá trị 4 do chúng ta đang dùng biến môi trườngNgoài ra, file 1 bạn cũng cần đổi lại giá trị của 6 thành 7 (tên container db)Chúng ta chạy các lệnh sau đển run docker: 3Bạn mở thêm 1 tab command line nữa và chạy 8 để kết nối CSDL với container db của DockerNếu cả các lệnh trên không báo lỗi và chúng ta truy cập lại trang http://127.0.0.1:8000/ vẫn như cũ thì ổn rồi. Lúc này, chúng ta đang chạy web với docker mà không cần phải vào môi trường ảo ( 9) mới có thể chạy được như phần 1 nữa.Nếu xảy ra một số lỗi khi chạy thì các bạn có thể search Google để fix lỗi Cài đặt Static và MediaThư mục static trong Django là nơi chứa các folder, file tĩnh. Bao gồm: folder css, javascipt, font và các file ảnh cố định cho trang web. Ngoài ra, mình cũng dowload các file cần thiết trong bootstrap 4 về để dùng, các bạn có thể sử dụng thư viện django-bootstrap4 nếu không muốn dùng nó trong static. Code cần thiết cho thư mục static mình để ở đây, các bạn có thể download về để sử dụng ngay. Tiếp theo, đi đến file settings.py chúng ta thêm đoạn code sau để Django nhận biết thư mục static: 4Ở đây, 0 và 1 là nơi Django lưu trữ các file static thông qua lệnh quản lý collectstatic khi deploy. 2 để Django thông qua đó tìm kiếm tất cả các file static rồi nạp vào nơi lưu trữThư mục static vừa tải xuống bên trên mình để ở trong thư mục con 3, cùng cấp với file settings.py. Tiếp theo ta chạy lệnh 4, thì Django sẽ tạo thư mục có đường dẫn như trong biến 0, cùng cấp với thư mục 3.Nếu sau này chúng ta muốn thay đổi thư mục static, ta chỉ cần sửa thư mục static cùng cấp với settings.py, rồi chạy lại lệnh collectstatic để khởi tạo lại thư mục static mới. Media là thư mục lưu trữ các file có kiểu media như các ảnh, video. Từ đó, server có thể truy cập để thêm, sửa, xóa trong đó. Cấu hình cho media như sau: 5Lần này chúng ta không cần làm gì thêm nữa. Nếu có lệnh truy cập thì Django sẽ tìm thư mục Media hoặc sẽ tạo nó nếu chưa có. Tùy chỉnh user model, category, product modelTrong Django, framework này đã tạo 1 mô hình mặc định cho người dùng có tên là user. Chúng ta nên tùy chỉnh và kế thừa các hàm từ đó vì việc mặc định này thường hạn chế yêu cầu của nhà phát triển. Tạo app mới có tên 7 với lệnh 8, thêm 9 vào biến mảng 0 trong file settings.py, cũng như thêm 1 biến mới 1, biến này thông báo cho Django biết ta không còn dùng mô hình user mặc định nữa mà thay vào đó là 7Ta thêm class như sau vào file 3: 6Thông tin các trường cần thiết cho bảng mới 4 mình đã comment bên cạnh để mọi người hiểu chức năng.Mình có tạo thêm class MyAccountManager để quản lý các thao tác người dùng: 7Chạy lệnh 5 sau đó là 6 để tạo bảng Account trong mysql. Và chạy lệnh 7 để tạo 1 superadmin cho hệ thống. Lúc này các trường bạn phải điền đã giống với hàm create_superuser mà chúng ta đã tùy chỉnh.Trong file 8 ta tạo thêm class để superadmin có thể quản lý bảng này: 8Chúng ta truy cập đường dẫn 9 để đăng nhập và được các màn hình như sau:
Tiếp theo, ta tạo app category với lệnh 0 như trên, ta thêm class Category vào file 1 như sau: 9Trường 2 là để định danh cho 1 category, trường 3 sẽ cho phép truy cập thư mục 4, đừng lo nếu ta chưa có thư mục này, Django sẽ tự tạo nó. Trong class con Meta, ta khai báo biến 5 và 6 vì nếu không có thì trong trang superadmin sẽ hiển thị 7, điều này thì không đúng chỉnh tả. Chạy lệnh 8 và 5 để tạo bảng.Thêm code cho file 00 để superuser có thể quản lý bảng category: 0Chúng ta có giao diện cho phần quản lý category của superuser như sau: Tiếp theo, chúng ta tạo app store để quản lý bảng product với lệnh 01. Trong file 02 ta tạo class Product như sau: 1Trong file 03 ta cũng thực hiện thêm app store để superuser quản lý: 2Ta có giao diện quản lý app product trong superuser như sau:
Trong file 04 ta tùy chỉnh biến urlpattern như sau: 3Ngoài ra, ở app store ta cũng tạo 1 file urls.py với biến 05: 4Trên đây, ta thực hiện khai báo các url trong file 04, biến 05 khai báo các cụm đường dẫn đến các app khác. Django sẽ tự động tìm các đường dẫn từ file này. Biến 05 trong file 09 sẽ khai báo cụ thể các đường dẫn như thế nào. Nó có tiền tố kế thừa từ file url chaThiết kế Cart, CartItem modelTa sẽ tạo 2 bảng cart và cart_item trong cùng 1 app là carts với lệnh 10. Ta tùy chỉnh file 11 với các class mới như sau: 5Và thêm đoạn code để superuser quản lý, ở file 12: 6Bảng Cart có các bản ghi mô tả các giỏ hàng của người dùng, bao gồm cả người dùng đã đăng nhập và người dùng vãng lai (bản ghi được tạo dựa trên cookie của máy local). Bảng CartItem với bản ghi tương ứng là các mục hàng trong giỏ hàng. Với 2 khóa ngoại là product và cart Tùy chỉnh biến 13 trong file 14 như sau: 7Template cho trang home, store, product_detailĐi đến trang settings.py, ta tùy chỉnh biến 15 ở cặp key-value như sau: 8Chúng ta tạo 1 folder đồng cấp với manager.py là 16 để Django tự động tìm folder này để load các file template.Từ file 17 ta thêm hàm 18 để làm chức năng điều hướng request: 9Từ folder template, ta tạo 1 file base.html làm file template cơ sở cho hầu hết các trang trong hệ thống. Và 1 file home.html làm trang chủ. Tất cả các file template, các bạn có thể tham khảo ở đây Tiếp theo, ta tùy chỉnh file 19 để hiển thị trang store. Ngoài ra, ta cũng thêm các file template cho app store. Tất cả mình để ở link github bên trên. Ta sẽ hiển thị các trang như sau:
Chúng ta thêm file template cho trang product-detail để được trang product-detail như sau: Kết thúcĐến đây mình xin được dừng phần 1, phần 2 mình sẽ sớm tiếp tục việc hoàn thiện các chức năng:
Tạm biệt mọi người và hẹn gặp lại
|