Biểu mẫu python và html

Kéo và thả là một tính năng rất phổ biến. Đó là khi bạn "chộp lấy" một đối tượng và kéo nó đến một vị trí khác


Hỗ trợ trình duyệt

Các số trong bảng chỉ định phiên bản trình duyệt đầu tiên hỗ trợ Kéo và Thả đầy đủ

APIDrag và Drop4. 09. 03. 56. 012. 0

Ví dụ Kéo và Thả HTML

Ví dụ dưới đây là một ví dụ kéo và thả đơn giản

Thí dụ






Biểu mẫu python và html


Tự mình thử »

Nó có vẻ phức tạp, nhưng chúng ta hãy đi qua tất cả các phần khác nhau của sự kiện kéo và thả



Tạo một phần tử có thể kéo được

Đầu tiên. Để làm cho một phần tử có thể kéo được, hãy đặt thuộc tính draggable thành true


Kéo cái gì - ondragstart và setData()

Sau đó, chỉ định điều gì sẽ xảy ra khi phần tử được kéo

Trong ví dụ trên, thuộc tính ondragstart gọi một hàm, kéo(sự kiện), chỉ định dữ liệu nào sẽ được kéo

Phương thức dataTransfer.setData() đặt kiểu dữ liệu và giá trị của dữ liệu được kéo

chức năng kéo (ev) {
ev. truyền dữ liệu. setData("văn bản", ev. Mục tiêu. Tôi);
}

Trong trường hợp này, kiểu dữ liệu là "văn bản" và giá trị là id của phần tử có thể kéo được ("drag1")


Thả ở đâu - ondragover

Sự kiện ondragover chỉ định nơi dữ liệu được kéo có thể bị xóa

Theo mặc định, không thể bỏ dữ liệu/phần tử vào các phần tử khác. Để cho phép giảm, chúng ta phải ngăn việc xử lý phần tử mặc định

Tìm hiểu từ hơn 300 ví dụ. Với trình chỉnh sửa của chúng tôi, bạn có thể chỉnh sửa CSS và nhấp vào nút để xem kết quả

Chuyển đến ví dụ về CSS


Sử dụng thực đơn

Chúng tôi khuyên bạn nên đọc hướng dẫn này, theo trình tự được liệt kê trong menu

Nếu bạn có màn hình lớn, menu sẽ luôn ở bên trái

Nếu bạn có màn hình nhỏ, hãy mở menu bằng cách nhấp vào ký hiệu menu trên cùng ☰


Mẫu CSS

Chúng tôi đã tạo một số W3 đáp ứng. Các mẫu CSS để bạn sử dụng

Bạn có thể tự do sửa đổi, lưu, chia sẻ và sử dụng chúng trong tất cả các dự án của mình

Mẫu CSS miễn phí



bài tập css

Kiểm tra bản thân với các bài tập


Câu đố về CSS

Kiểm tra kỹ năng CSS của bạn bằng một bài kiểm tra

Bắt đầu bài kiểm tra CSS


Việc học của tôi

Theo dõi tiến trình của bạn với chương trình "Học tập của tôi" miễn phí tại W3Schools

Đăng nhập vào tài khoản của bạn và bắt đầu kiếm điểm

Đây là một tính năng tùy chọn. Bạn có thể học W3Schools mà không cần sử dụng My Learning

Biểu mẫu python và html


Tài liệu tham khảo CSS

Tại W3Schools, bạn sẽ tìm thấy các tham chiếu CSS hoàn chỉnh của tất cả các thuộc tính và bộ chọn với cú pháp, ví dụ, hỗ trợ trình duyệt, v.v.

Trong phần này, chúng ta sẽ cùng tìm hiểu về khái niệm Web Form và cách sử dụng Web Form trong Flask

Để giúp các bạn dễ theo dõi, sau đây là danh sách các bài viết trong chuỗi bài hướng dẫn này

  • Phần 1. Chào thế giới
  • Phần 2. Tìm hiểu về mẫu
  • Phần 3. Tìm hiểu về Web Forms (bài viết này)
  • Phần 4. Sử dụng cơ sở dữ liệu
  • Phần 5. Xử lý đăng nhập
  • Phần 6. Hồ sơ cá nhân và ảnh đại diện
  • Phần 7. Xử lý lỗi
  • Phần 8. Tạo chức năng theo dõi
  • Phần 9. Partition
  • Phần 10. email hỗ trợ
  • Phần 11. Nâng cấp giao diện
  • Phần 12. Xử lý thời gian
  • Phần 13. Hỗ trợ đa ngôn ngữ
  • Phần 14. Sử dụng Ajax
  • Phần 15. Tinh chỉnh cấu trúc ứng dụng
  • Phần 16. Hỗ trợ tìm kiếm hỗ trợ
  • Phần 17. Triển khai ứng dụng trên Linux
  • Phần 18. Triển khai ứng dụng với Heroku
  • Phần 19. Triển khai ứng dụng với Docker
  • Phần 20. JavaScript nâng cao
  • Phần 21. Thông báo cho người sử dụng
  • Phần 22. Tìm hiểu về nhiệm vụ nền
  • Phần 23. Xây dựng API

Bạn có thể truy cập mã nguồn cho phần này tại GitHub

Trong Phần 2, chúng tôi đã tạo ra một mẫu đơn giản cho trang chủ của ứng dụng và sử dụng các đối tượng giả lập cho các thành phần mà chúng tôi chưa xây dựng như đối tượng người dùng, bài viết. Trong chương trình này, chúng ta sẽ tìm hiểu kỹ hơn về các điểm yếu của ứng dụng cho đến thời điểm này, đặt biệt là vấn đề tiếp nhận và xử lý các yêu cầu của người sử dụng xử lý thông tin qua biểu mẫu Web

Một cách tổng hợp, Web form (đừng nhầm lẫn với khái niệm Web form trong các ứng dụng ASP/ASP. NET truyền thống nhé, chúng không liên quan gì đến nhau mặc dù có cùng tên gọi) là một trong những thành phần cơ bản của bất kỳ ứng dụng Web nào. Chúng ta sẽ sử dụng biểu mẫu Web để người sử dụng có thể gửi dữ liệu như bài viết, thông tin đăng nhập từ trình duyệt đến ứng dụng của chúng ta

Trước khi bắt đầu phần mới, hãy đảm bảo rằng ứng dụng myblog mà chúng tôi đã xây dựng đã được thiết lập và chạy thành công

Flask-WTF giới thiệu

Để xử lý Web form trong ứng dụng, chúng ta sẽ sử dụng thư viện mở rộng (extension) Flask-WTF. Đây là một giao diện cho gói WTForms được tích hợp với Flask. Đây là thư viện mở rộng đầu tiên mà chúng tôi sử dụng, nhưng sẽ không phải là cuối cùng. Các thư viện mở rộng là một thành phần quan trọng trong hệ sinh thái của Flask bởi vì họ cung cấp các giải pháp mà Flask không có (dù là cố tình hay vô ý)

Các thư viện mở rộng của Flask là các gói thư viện Python tiêu chuẩn được cài đặt bằng cách sử dụng pip. Bạn có thể cài đặt Flask-WTF trong môi trường ảo của bạn như sau

1

(myenv) $ pip3 install flask-wtf

Config setting

Cho đến thời điểm này, ứng dụng của chúng ta vẫn còn rất sơ khai, và do đó, chúng ta không cần phải đề cập đến nhiều vấn đề về cấu hình (configuration). Nhưng đối với bất kỳ ứng dụng nào ngoại trừ các ứng dụng rất đơn giản, chúng ta sẽ thấy rằng Flask (và có thể bao gồm các thư viện mở rộng của Flask mà bạn sử dụng) cho phép chúng ta tự làm trong quá trình thực hiện . Và khi bạn cần quyết định bất kỳ điều gì đó, bạn sẽ cho Flask biết thông qua một danh sách các tham số cấu hình

Có một số định dạng khác nhau trong việc cung cấp cấu hình cho ứng dụng. Giải pháp cơ bản nhất là định nghĩa các tham số cấu hình của bạn thông qua các từ khóa (key) trong tệp app.config. Tệp này sử dụng kiểu từ điển để mô tả các tham số. Ví dụ như sau

1

2

3

app = Flask(__name__)

ứng dụng. config['SECRET_KEY'] = 'khong-doan-noi-dau'

.. . c á c th ô ng s cn thiết khác

Dù cấu trúc trên đây là đầy đủ việc định nghĩa cấu hình cho Flask, chúng ta vẫn phải tuân theo nguyên tắc phân chia các mối quan tâm (tách các mối quan tâm). Cụ thể hơn, thay vì đặt tất cả các thông số cấu hình vào mã khởi động của ứng dụng, chúng ta sẽ đặt nó vào một tệp cấu hình riêng rẽ

Trong khuôn khổ của loạt bài này, chúng ta sẽ tuân theo quy ước là sử dụng một lớp để chứa tất cả các thông số cấu hình của ứng dụng. Để giữ cho cấu trúc chung của ứng dụng được gọn gàng, chúng ta sẽ tạo ra các lớp cấu hình trong một mô-đun Python riêng biệt. Sau đây là các khai báo trong lớp cấu hình cho ứng dụng trong tệp cấu hình. py mà chúng ta sẽ lưu ở thư mục bên ngoài cùng của ứng dụng

cấu hình. py. Configure to key code

1

2

3

4

nhập os

 

lớp Cấu hình(đối tượng):

    SECRET_KEY = os. môi trường. lấy('SECRET_KEY') or 'khong-doan-noi-dau'

Rất đơn giản phải không? . Nếu chúng ta cần khai báo các tham số mới, chúng ta sẽ thêm các biến mới vào lớp này. Thậm chí nếu sau này chúng ta cần nhiều bộ tham số, chúng ta có thể tạo ra các lớp con của lớp này. Nhưng bây giờ tạm thời chúng ta không cần đi sâu

Tham số cấu hình SECRET_KEY trong lớp Config là một phần rất quan trọng trong các ứng dụng Flask. Flask và một số thư viện mở rộng thư viện sử dụng giá trị của biến này với vai trò là khóa mã hóa để tạo ra các ký tự hoặc mã thông báo bảo mật. Thư viện mở rộng Flask-WTF sử dụng khóa này để bảo vệ biểu mẫu Web khỏi một hình thức tấn công phổ biến là Cross-Site Request Forgery hoặc là CRSF. Dễ thấy từ tên gọi của tham số này, nó phải là một khóa bí mật do đã quyết định mức độ quan trọng của các chữ ký và mã thông báo bảo mật để bảo vệ cho ứng dụng

Giá trị của khóa bí mật này là một biểu thức với hai mệnh đề được ghép lại với nhau thông qua toán tử HOẶC. Mệnh đề thức nhất sẽ tìm ra giá trị của một biến môi trường còn được gọi là SECRET_KEY. Mệnh đề thứ hai là một chuỗi được xác định sẵn. Chúng ta sẽ sử dụng cách này thường xuyên để thiết lập các tham số cấu hình xuyên suốt chuỗi bài này. Lý do là nó cho phép chúng ta có thể sử dụng giá trị của khóa từ biến môi trường hoặc chuỗi định sẵn một cách linh hoạt. Trong môi trường phát triển, ít có nguy cơ bảo mật thì chúng ta không thể khai báo biến môi trường và làm như vậy, ứng dụng sẽ sử dụng giá trị của chuỗi định sẵn. Tuy nhiên, khi sử dụng chính thức, chúng ta sẽ thiết lập một giá trị riêng cho khóa này trong môi trường biến. Giá trị này là duy nhất và khó có thể đoán được bởi các phần mềm hack, vì thế chúng ta có thể chắc chắn rằng những dữ liệu nhạy cảm không bị lộ

Sau khi đã có file cấu hình, chúng ta cần chọn Flask know to get information from that and used for application. Chúng ta làm điều này bằng cách cập nhật tệp __init__. py và thêm một dòng lệnh sử dụng hàm app.config.from_object() như sau

ứng dụng/__init__. py. cấu hình Flask

1

2

3

4

5

6

7

từ bình nhập Bình

từ config nhập Cấu hình

 

app = Flask(__name__)

ứng dụng. config. from_object(Cấu hình)

 

từ ứng dụng nhập tuyến đường

T liếc nhìn thì cách tham chiếu đến lớp Config có vẻ hơi khó hiểu. Nhưng nếu bạn quan sát kỹ thì nó cũng tương tự như cách chúng ta khai báo tham chiếu đến thực thể flask trong thư viện Flask mà chúng ta đã làm qua trước đây (Xin lưu ý sự khác nhau giữa chữ “f” thường và chữ “ . Ở đây, tên “config” (chữ thường) là tên của module config. py, còn tên “Config” là tên của cấu hình lớp trong cấu hình mô-đun. py

Như đã nói ở trên, các tham số cấu hình sẽ được truy cập thông qua từ điển trong app.config. Dưới đây là một ví dụ để lấy giá trị của khóa bí mật bằng trình biên dịch Python

1

2

3

>>> từ blog của tôi nhập ứng dụngnhậpứng dụngnhậpứng dụng

>>> ứng dụng. config['SECRET_KEY']

'khong-doan-noi-dau'

Form đăng nhập (form đăng nhập)

Thư viện mở rộng (Flask-WTF) sử dụng các lớp trong Python để đại diện cho các biểu mẫu Web. Các lớp này – gọi tắt là lớp biểu mẫu) sẽ định nghĩa các trường (trường) có trên biểu mẫu thông qua các biến thành viên

Theo đúng nguyên tắc phân chia các mối quan tâm đã được đề cập ở trên, chúng ta sẽ tạo ra một mô-đun mới trong thư mục ứng dụng có tên là biểu mẫu. py để chứa các thông tin về form đăng nhập của chúng tôi. Chúng ta bắt đầu với một biểu mẫu đơn giản bao gồm hai khung nhập văn bản (hộp văn bản) để người dùng có thể nhập tên người dùng và mật khẩu (tên người dùng và mật khẩu). Biểu mẫu này cũng có thêm một dấu đánh dấu (hộp kiểm) có tên là “Ghi nhớ tôi” và một lần nhấn nút để gửi thông tin đăng nhập từ trình duyệt của người sử dụng về ứng dụng trên máy chủ (nút gửi)

ứng dụng/biểu mẫu. py. đăng nhập mẫu

1

2

3

4

5

6

7

8

9

từ flask_wtf nhập FlaskForm

từ wtforms nhập StringField, PasswordField, BooleanField, SubmitField

từ wtforms. trình xác thực nhập Dữ liệu bắt buộc

 

class LoginForm(FlaskForm):

    tên người dùng = StringField('Username', validators=[DataRequired()])

    mật khẩu = Trường mật khẩu('Password', validators=[DataRequired()])

    remember_me = BooleanField('Remember me')

    gửi = Trường gửi('Sign In')

Đa số thư viện mở rộng của Flask sử dụng quy ước app.config0 để nhận định dạng các tham chiếu đến chúng. Flask-WTF cũng không ngoại lệ và sử dụng tên tham chiếu là app.config1. Để sử dụng mô-đun app.config2 từ thư viện Flask-WTF, chúng tôi khai báo như ở đầu tệp ứng dụng/biểu mẫu. py

Ứng dụng của chúng tôi cũng sử dụng bốn lớp khác nhau từ gói WTForms để đại diện cho các trường nhập dữ liệu tương ứng. Mỗi trường sẽ được đại diện bởi một biến trong lớp app.config3. Tham số đầu tiên khi khởi tạo mỗi trường sẽ là mô tả hoặc nhãn của chúng. Tham số tùy chọn app.config4 khi khởi tạo trường tên người dùng và mật khẩu cho phép chúng tôi kiểm tra dữ liệu đầu vào. Biến kiểm tra (validator) app.config5 là một biến được định nghĩa bởi Flask-WTF cho phép ứng dụng kiểm tra và phát thông báo lỗi nếu không có dữ liệu nhập vào trường tương ứng. Có nhiều kiểu biến kiểm tra khác nhau mà chúng ta sẽ tìm hiểu về sau

Mẫu cho Biểu mẫu

Bước tiếp theo là tạo một mẫu HTML sử dụng biểu mẫu của chúng tôi. Việc tạo mẫu này không quá phức tạp vì các trường được định nghĩa trong Lớp LoginForm biết cách tạo mã HTML cho chính chúng. Sau đây là đoạn mã để tạo mẫu đăng nhập, chúng ta sẽ đặt mã này vào tệp app/templates/login. html

ứng dụng/mẫu/đăng nhập. html. mẫu cho mẫu đăng nhập

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

{% mở rộng "cơ sở. html" %}

 

{% chặn nội dung %}

    

Đăng nhập

    

hành động="" method="post" novalidate>

{{ hình thức. hidden_tag() }}

        

            {{ biểu mẫu. tên tài khoản. nhãn }}

{{ hình thức. tên người dùng(size=32) }}

        

        

            {{ biểu mẫu. mật khẩu mở khóa. nhãn }}

{{ hình thức. mật khẩu(size=32) }}

        

        

{{ biểu mẫu. memory_me() }} {{ biểu mẫu. nhớ_tôi. nhãn }}

        

{{ biểu mẫu. gửi() }}

   

{% chặn kết thúc %}

Trong mẫu này, chúng tôi sẽ sử dụng lại cơ sở mẫu. html được giới thiệu trong Phần 2 bằng cách sử dụng lệnh app.config6 để kế thừa mẫu. Chúng ta sẽ sử dụng cấu trúc này cho tất cả các mẫu mới để đảm bảo chắc chắn rằng tất cả các trang trong ứng dụng của chúng ta đều có cấu trúc (bố cục) giống nhau với thanh định hướng ở đầu trang

Mẫu này cần có một tham số là một thực thể đã được khởi tạo của lớp app.config3 được đại diện bởi biểu mẫu thẻ trong đoạn mã ở trên. Tham số này cần được truyền từ hàm hiển thị đăng nhập mà chúng ta vẫn chưa tạo ra

Thẻ HTML app.config8 trong đoạn mã trên thực tế không phải chỉ là một thẻ HTML, nó là một vật chứa (vùng chứa) cho biểu mẫu web. Thuộc tính app.config9 của biểu mẫu dùng để thông báo cho trình duyệt biết rằng nó sẽ yêu cầu gửi dữ liệu do người dùng nhập vào địa chỉ (URL) nào. Nếu chúng ta gán một chuỗi trống cho thuộc tính này thì theo mặc định, nó sẽ gửi tất cả dữ liệu đến địa chỉ hành động hiện hành – URL mà chúng ta đã thấy trên thanh địa chỉ của trình duyệt khi truy cập trang Web này. Thuộc tính Config0 báo cho trình duyệt phải sử dụng phương thức nào để gửi dữ liệu trong giao thức HTTP. Phương thức mặc định là gửi yêu cầu theo dạng Config1, tuy nhiên, trong phần lớn trường hợp chúng ta nên sử dụng Config2 để gửi dữ liệu vì Config2 có nhiều ưu điểm hơn cho tác vụ này, ví dụ như nó có thể gửi các dữ liệu . Thuộc tính Config5 dùng để thông báo với trình duyệt không kiểm tra dữ liệu của các trường trong biểu mẫu – do công việc kiểm tra dữ liệu sẽ thực hiện Flask kiểm tra thông tin qua mã mà chúng tôi đã viết trong biểu mẫu tệp. py. Việc sử dụng thuộc tính Config5 là tùy chọn, tuy nhiên đối với biểu mẫu đăng nhập của chúng ta thì chúng ta cần sử dụng nó vì nó cho phép chúng ta kiểm tra việc xác nhận dữ liệu ở máy chủ (xác thực phía máy chủ) mà chúng ta sẽ

Tham số Config7 sẽ tạo ra một trường ẩn (hidden field) để chứa một mã thông báo được sử dụng để bảo vệ biểu mẫu khỏi các cuộc tấn công CSRF mà chúng tôi đã đề cập ở trên. Tất cả những gì chúng ta phải làm để ngăn chặn các cuộc tấn công này là thêm một trường ẩn vào biểu mẫu và định nghĩa biến SECRET_KEY trong tệp cấu hình Flask. Nếu chúng ta thực hiện đủ các điều kiện này, Flask-WTF có đủ thông tin để thực hiện phần còn lại

Nếu bạn đã từng viết biểu mẫu Web HTML, có thể bạn sẽ thấy lạ vì không có thẻ HTML nào trong mẫu này. Lý do là vì đối tượng biểu mẫu mà chúng ta khai báo trong biểu mẫu. py biết cách tạo mã HTML cho các trường tương ứng. Việc chúng ta cần làm là đặt tuyên bố Config9 tại nhãn của trường và SECRET_KEY0 tại vị trí của trường đó. Nếu có trường nào cần thêm nhãn thuộc tính khác bên ngoài, chúng ta có thể thêm tham số tương ứng khi khởi tạo đối tượng cho trường đó trong Lớp app.config3(trong các biểu mẫu mô-đun. py). Ví dụ như khi bạn khởi tạo tên người dùng và mật khẩu của các đối tượng, bạn có thể thêm tham số SECRET_KEY2 để chỉ định độ dài cho thẻ HTML SECRET_KEY3 để các đối tượng này sinh ra. Đây cũng là cách để bạn có thể chỉ định các thuộc tính CSS và mã xác định (ID) cho các trường trong biểu mẫu

Hiển thị biểu mẫu

Chúng ta đã làm hầu hết các bước để tạo ra biểu mẫu đăng nhập (đăng nhập). Tuy nhiên, để hiển thị biểu mẫu này trong trình duyệt, chúng ta cần tạo ra hàm hiển thị tương ứng và ánh xạ hàm này vào một URL – cụ thể là SECRET_KEY4. Khi người sử dụng nhập URL này vào trình duyệt (_______7_______5) thì ứng dụng sẽ tạo ra biểu mẫu đăng nhập và truyền nó vào mẫu tương ứng để xuất ra. Chúng ta sẽ viết mã cho chức năng hiển thị mới này trong ứng dụng/tuyến mô-đun. py which they ta made ra in the previous section

ứng dụng/tuyến đường. py. Hàm hiển thị cho form Đăng nhập

1

2

3

4

5

6

7

8

9

10

từ flask nhập render_template

từ ứng dụng nhập ứng dụng

từ ứng dụng. biểu mẫu nhập LoginForm

 

.. .

 

@ứng dụng. tuyến đường('/đăng nhập')

def đăng nhập().

    biểu mẫu = Biểu mẫu đăng nhập()

    return render_template('đăng nhập. html', tiêu đề='Đăng nhập', form=form)

Ở đây, chúng ta thêm tham chiếu đến lớp app.config3 từ các biểu mẫu mô-đun. py, khởi tạo một đối tượng từ lớp này và truyền đối tượng này vào đăng nhập mẫu. html by way call function SECRET_KEY7. Đừng ngạc nhiên với các tham số cuối cùng khi gọi hàm (_______7_______8), thực ra nó chỉ đơn giản là truyền đối tượng SECRET_KEY9 mà chúng ta tạo ra từ lớp app.config3 trong dòng mã ở trên và truyền nó vào một biểu mẫu web có tên là SECRET_KEY9 . html). Tất cả chỉ có vậy, chúng ta đã thành công trong công việc liên kết biểu mẫu mà chúng ta tạo ra bằng mã Python với mẫu theo định dạng của Jinja2. Flask sẽ làm lại phần còn lại

Để giúp việc truy cập biểu mẫu Đăng nhập dễ dàng hơn, chúng ta sẽ thay đổi một chút thanh định hướng ở cơ sở mẫu. html

ứng dụng/mẫu/cơ sở. html. Liên kết đến trang Đăng nhập trong thanh định hướng

1

2

3

4

5

Blog của tôi

    href="/index"<>Home

    href="/login"<>Login

Đến đây, bạn có thể chạy thử ứng dụng một lần nữa và kiểm tra biểu mẫu mà chúng tôi đã tạo ra. Sau khi ứng dụng được kích hoạt, hãy nhập địa chỉ SECRET_KEY2 vào trình duyệt và nhấp vào liên kết “Đăng nhập” trên thanh định hướng để truy cập trang Đăng nhập. Bạn thấy thế nào?

Biểu mẫu python và html
Nhận dữ liệu từ biểu mẫu

Đến đây, chúng ta đã có một biểu mẫu đăng nhập thực sự hấp dẫn. Tuy nhiên, nếu bạn thử bấm vào nút “Đăng nhập”, chúng ta sẽ thấy một thông báo lỗi không mấy dễ chịu. “Phương pháp không được phép”. Chuyện gì xảy ra ở đây? . nó hiển thị biểu mẫu nhưng hoàn toàn không có bất kỳ mã lệnh nào để thực hiện công việc xử lý dữ liệu nhận được khi người dùng nhấn nút gửi (gửi) dữ liệu – nút “Đăng nhập” trên biểu mẫu của chúng tôi. Tiếp theo, chúng ta sẽ cập nhật chức năng hiển thị để nhận và kiểm tra dữ liệu do người dùng nhập vào biểu mẫu như sau

ứng dụng/tuyến đường. py. Nhận thông tin người sử dụng

1

2

3

4

5

6

7

8

9

10

từ flask nhập render_template, flash, redirect

 

@ứng dụng. tuyến đường('/đăng nhập', methods=['GET', 'POST'])

def đăng nhập().

    biểu mẫu = Biểu mẫu đăng nhập()

    nếu biểu mẫu. validate_on_submit().

        flash('Yeu cau dang nhap tu user {}, memory_me={}'< . .định dạng(

            biểu mẫu. tên người dùng. dữ liệu, biểu mẫu. nhớ_tôi. dữ liệu))

        trả lại chuyển hướng('/index')

    return render_template('đăng nhập. html', tiêu đề='Đăng nhập', form=form)

Điểm mới được thấy đầu tiên trong đoạn mã trên là tham số SECRET_KEY3 trong phần trang trí SECRET_KEY4. Tham số này báo cho Flask là hàm hiển thị chấp nhận các yêu cầu theo định dạng Config1 và Config2 (theo mặc định, hàm hiển thị chỉ nhận yêu cầu theo định dạng GET). Giao thức HTTP định nghĩa các yêu cầu Config1 là các yêu cầu trả về thông tin cho khách hàng – hay là trình duyệt trong trường hợp này. Cho đến hiện tại, tất cả các yêu cầu trong ứng dụng của chúng ta đều theo định dạng Config1. Các yêu cầu Config2 thường được sử dụng khi cần gửi dữ liệu trong biểu mẫu về máy chủ (trong thực tế, chúng tôi cũng có thể sử dụng yêu cầu Config1 để gửi dữ liệu, nhưng phương pháp này không được khuyến khích như đã nói trong phần . Lý do chúng tôi nhận được thông báo lỗi “Phương thức không được phép” vừa rồi là biểu mẫu của chúng tôi gửi dữ liệu về máy chủ theo định dạng Config2 trong khi hàm hiển thị chưa được thay đổi và chỉ chấp nhận các yêu cầu Config1. Bây giờ, chúng tôi cung cấp các phương pháp tham số cho cả Config2 và Config1 để cảnh báo với Flask rằng nó phải chấp nhận yêu cầu theo cả hai định dạng

Hàm app.config.from_object()5 xử lý mọi sự kiện cho biểu mẫu. Khi trình duyệt gửi yêu cầu dạng Config1 về máy chủ để lấy và hiển thị trang đăng nhập, hàm này sẽ trả về giá trị  app.config.from_object()7, do đó hàm hiển thị sẽ bỏ qua các câu lệnh trong điều kiện app.config.from_object()8 và thực hiện câu lệnh

Nếu người sử dụng nhấn nút “Đăng nhập”, trình duyệt sẽ gửi yêu cầu dưới dạng Config2 về máy chủ. Khi đó hàm app.config.from_object()5 sẽ tiến hành thu thập dữ liệu từ các trường và chạy các đoạn mã kiểm tra dữ liệu. Nếu tất cả dữ liệu đều hợp lệ, hàm này sẽ trả về giá trị Config1 và cho phép ứng dụng bắt đầu xử lý dữ liệu. Nếu một trong các trường có dữ liệu không hợp lệ, hàm này sẽ trả về app.config.from_object()7 và do đó, sẽ hiển thị trang đăng nhập một lần nữa tương tự như khi trình duyệt gửi yêu cầu định dạng Config1. Sau đó, chúng tôi sẽ bổ sung thêm một thông báo lỗi và hiển thị cho người dùng nếu dữ liệu không hợp lệ

Tiếp theo, khi hàm app.config.from_object()5 trả về Config1, hàm hiển thị sẽ gọi hai hàm mới được tham khảo từ Flask. HàmConfig6 sẽ giúp chúng ta hiển thị một thông điệp trên trang Web. Nhiều ứng dụng web sử dụng kỹ thuật này để cảnh báo người dùng các hoạt động tương tác của họ với ứng dụng có thành công hay không. Trong trường hợp này, chúng tôi chỉ tạm thời sử dụng ứng dụng thông báo để thông báo người dùng đã đăng nhập thành công vì chúng tôi chưa có hệ thống quản lý và xác thực danh sách của người dùng (chúng tôi sẽ thêm phần này vào . Hiện tại, điều chúng ta có thể làm là hiển thị một thông báo để xác nhận ứng dụng đã nhận được thông tin của người dùng

Hàm thứ hai được gọi trong hàm hiển thị là Config7. This message for known browser to auto convert to a other page. Địa chỉ của trang sẽ được chuyển đến là tham số được truyền vào hàm. Trong trường hợp này, thông số đó là Config8, vì vậy, ứng dụng sẽ tự động chuyển đến trang chủ nếu người dùng đăng nhập thành công

Khi bạn gọi hàm Config6, Flask sẽ chứa thông báo bạn truyền vào, nhưng thông báo này sẽ không tự động hiển thị trên trang Web. Vì vậy, chúng ta cần thực hiện thêm một vài thao tác để hiển thị thông báo này. Chúng ta sẽ thêm một số mã lệnh mới vào cơ sở mẫu. html để nó được hiển thị trên mọi mẫu được kế thừa từ mẫu này. Sau đây là cơ sở mẫu. html has been update

ứng dụng/mẫu/cơ sở. html. Hiển thị thông báo được truyền vào hàm flash()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

    

{% nếu tiêu đề %}

        </span><span>{{ title }} - Blog của tôi</span><span>

{% khác %}

        </span><span>blog của tôi</span><span>

{% endif %}

    

    

        

Blog của tôi

            href="/index"<>Home

            href="/login"<>Login

        

        


{% có tin nhắn = get_flashed_messages() %}

{% nếu tin nhắn %}

        

    {% cho tin nhắn trong tin nhắn %}

                

  • {{ message }}
  • {% endfor %}

            

{% endif %}

{% kết thúc với %}

{% khối nội dung %}{% khối cuối %}

    

Ở đây chúng ta sử dụng mệnh đề để gán giá trị trả về từ hàm flask0 vào biến flask1. Hàm flask0 được định nghĩa bởi Flask, hàm này sẽ trả về danh sách các thông điệp đã được truyền vào hàm Config6 trước đây. Lệnh điều kiện nếu tiếp theo sau khi kiểm tra xem biến flask1 có được gán giá trị nào không. Nếu có thì mẫu sẽ tạo ra một danh sách (sử dụng thẻ HTML flask5) và trình bày mỗi thông báo trả về trong thư dưới dạng một phần từ của danh sách (sử dụng thẻ HTML flask6). Cách trình bày này có thể không đẹp mắt lắm nhưng cứ tạm chấp nhận như vậy. Sau này chúng ta sẽ cải tiến cách trình bày sao cho đẹp hơn

Một điểm đáng lưu ý ở đây là các thông điệp được lưu lại bằng hàm Config6 sẽ bị xóa khỏi danh sách thông điệp sau khi hàm flask8 được gọi. Vì vậy các thông báo này chỉ có thể xuất hiện một lần sau khi chúng ta gọi hàm Config6 để lưu lại chúng

Đến đây, bạn có thể thử chạy chương trình một lần nữa để tìm hiểu cách làm việc của biểu mẫu nếu bạn cảm thấy chưa hiểu rõ. Khi chạy chương trình, bạn hãy thử nhấn nút “Đăng nhập” để gửi dữ liệu về máy chủ nhưng bỏ trống trường “tên người dùng” hoặc “mật khẩu”, làm như vậy bạn sẽ thấy cách hoạt động của các biến kiểm tra dữ liệu app.config5

Nâng cấp mã kiểm tra dữ liệu cho các trường nhập liệu

Các biến kiểm tra dữ liệu (validator) mà chúng ta đã liên kết với các trường dữ liệu sẽ không cho phép các dữ liệu bất hợp lệ được gửi về ứng dụng trên máy chủ. Khi dữ liệu không hợp lệ, ứng dụng sẽ hiển thị lại biểu mẫu để người dùng nhập lại dữ liệu

Nếu bạn cố gắng gửi dữ liệu không hợp lệ với biểu mẫu đăng nhập của chúng tôi, có thể bạn sẽ lưu ý rằng dù biểu mẫu hoạt động không đúng theo ý đồ của chúng tôi (hiển thị lại biểu mẫu với dữ liệu nhập để bạn sửa đổi) . Vì vậy chúng ta có thể cải tiến tiến trình mã của chúng ta để đưa ra các thông báo lỗi thích hợp và giúp người dùng dễ dàng nhận ra dữ liệu không hợp lệ

Thật ra thì khi dữ liệu không hợp lệ, các biến kiểm tra dữ liệu đã sinh ra các thông báo lỗi rồi, điều chúng ta cần làm là thêm một vài dòng lệnh để hiển thị các thông báo lỗi này theo thời gian

Sau đây là phiên bản mới của đăng nhập mẫu với thông báo lỗi cho tên người dùng và mật khẩu của trường

ứng dụng/mẫu/đăng nhập. html. Thông báo lỗi nhập dữ liệu trong mẫu Đăng nhập

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

{% mở rộng "cơ sở. html" %}

 

{% chặn nội dung %}

    

Đăng nhập

    

hành động="" method="post" novalidate>

{{ hình thức. hidden_tag() }}

        

            {{ biểu mẫu. tên tài khoản. nhãn }}

            {{ biểu mẫu. tên người dùng(size=32) }}

{% cho lỗi trong biểu mẫu. tên tài khoản. lỗi %}

            kiểu="color. đỏ;">[{{ error }}]

{% endfor %}

        

        

            {{ biểu mẫu. mật khẩu mở khóa. nhãn }}

            {{ biểu mẫu. mật khẩu(size=32) }}

{% cho lỗi trong biểu mẫu. mật khẩu mở khóa. lỗi %}

            kiểu="color. đỏ;">[{{ error }}]

{% endfor %}

        

        

{{ biểu mẫu. memory_me() }} {{ biểu mẫu. nhớ_tôi. nhãn }}

        

{{ biểu mẫu. gửi() }}

   

{% chặn kết thúc %}

Thay đổi duy nhất mà chúng tôi đã làm ở đây là thêm một vòng lặp ngay sau mã cho tên người dùng và mật khẩu của trường để hiển thị các thông báo lỗi được sinh ra bởi biến kiểm tra bằng màu đỏ. Theo quy ước, các thông báo lỗi cho các trường có liên kết với biến kiểm tra dữ liệu sẽ được bổ sung vào biến Flask1. Các lỗi biến đổi sẽ là một danh sách (list) vì mỗi trường có thể liên kết với nhiều biến kiểm tra dữ liệu khác nhau và có khả năng sinh ra nhiều lỗi đồng thời. Sau khi bạn cập nhật mẫu đăng nhập. html, nếu bạn thử gửi biểu mẫu mà không nhập tên người dùng hoặc mật khẩu, bạn sẽ thấy các thông báo lỗi màu đỏ

Biểu mẫu python và html
Tạo liên kết (link)

Đến đây thì form đăng nhập gần như hoàn tất. Nhưng trước khi kết thúc phần này, chúng ta sẽ nói qua một chút về cách đặt các liên kết (link) và chuyển trang (redirect). Cho đến giờ, bạn đã thấy một số trường hợp chúng ta đặt các liên kết vào ứng dụng. Ví dụ như trong thanh định hướng ở cơ sở mẫu. html

1

2

3

4

5

    

Blog của tôi

        href="/index"<>Home

        href="/login"<>Login

    

Hàm hiển thị cho trang đăng nhập cũng có một liên kết dưới dạng tham số cho hàm Config7

1

2

3

4

5

6

7

@ứng dụng. tuyến đường('/đăng nhập', methods=['GET', 'POST'])

def đăng nhập().

    biểu mẫu = Biểu mẫu đăng nhập()

    nếu biểu mẫu. validate_on_submit().

        . . .

        trả lại chuyển hướng('/index')

    . . .

Tạm dừng các liên kết này vẫn hoạt động bình thường. Tuy nhiên, nếu vì lý do nào đó mà bạn thay đổi địa chỉ (URL) cho các mẫu này thì bạn sẽ phải tìm và thay đổi các liên kết này trong mã của bạn bằng địa chỉ mới

Để tránh tình trạng này, Flask cung cấp một chức năng rất hữu ích là Flask3. Hàm này sẽ tạo URL cho các liên kết của bạn từ hàm hiển thị. Ví dụ như Flask4 sẽ trả về_______7_______4, và Flask6 sẽ trả về Config8. Tham số mà hàm này cần là tên của điểm truy cập (điểm cuối) – cũng là tên của hàm hiển thị

Bạn có thể thắc mắc tại sao sử dụng tên hàm hiển thị lại tốt hơn là sử dụng địa chỉ trực tiếp. Lý do chính là các URL thường có xu hướng dễ bị thay đổi hơn là các tên hàm hiển thị vì các hàm hiển thị thuộc lớp trong ứng dụng của ứng dụng và ít khi bị thay đổi. Một lý do nữa mà bạn sẽ thấy sau đây là một số URL có các thành phần không cố định. Vì vậy, việc sử dụng các URL một cách thủ công sẽ yêu cầu bạn cắt ghép nhiều phần lại với nhau – một quá trình rất mất công và dễ gây ra sai sót. Chúng ta hoàn toàn có thể tránh được công việc này bằng cách sử dụng hàm Flask3 để tạo ra các URL phức tạp từ tên hàm hiển thị

Vì thế, từ bây giờ chúng ta sẽ làm quen với tập tin bằng cách sử dụng hàm Flask3 Mỗi khi chúng ta cần tạo ra các địa chỉ (hoặc liên kết – URL) cho ứng dụng. Theo đó, mã cho thanh định hướng trong cơ sở mẫu. html will be edit again as after

ứng dụng/mẫu/cơ sở. html. Sử dụng hàm Flask3 để tạo các liên kết

1

2

3

4

5

    

Blog của tôi

        href="{{ url_for(>Home

        href="{{ url_for(>Login

    

Và cuối cùng là hàm hiển thị login() sử dụng hàm url_for

ứng dụng/tuyến đường. py. Sử dụng hàm Flask3 để tạo các liên kết

1

2

3

4

5

6

7

8

9

10

11

từ flask nhập render_template, flash, redirect, url_for

 

#

 

@ứng dụng. tuyến đường('/đăng nhập', methods=['GET', 'POST'])

def đăng nhập().

    biểu mẫu = Biểu mẫu đăng nhập()

    nếu biểu mẫu. validate_on_submit().

        . . .

        trả lại chuyển hướng(url_for('index'))

    . . .

Đến đây, chúng ta có thể chạy thử lần nữa và lần này, bạn hãy thử nhập đầy đủ tên người dùng, mật khẩu và sau cùng, nhấn nút “Đăng nhập“. Bạn sẽ thấy kết quả tương tự như sau