Thứ năm, 15/10/2020 | 00:00 GMT+7

Cách sửa đổi các mục trong mối quan hệ một-nhiều database với Flask và SQLite

Flask là một khuôn khổ để xây dựng các ứng dụng web bằng ngôn ngữ Python và SQLite là một công cụ database được dùng với Python để lưu trữ dữ liệu ứng dụng. Trong hướng dẫn này, bạn sẽ sửa đổi các mục trong ứng dụng được xây dựng bằng Flask và SQLite với mối quan hệ Một-nhiều.

Hướng dẫn này là phần tiếp theo của Cách sử dụng Mối quan hệ Database Một-Nhiều với Flask và SQLite . Sau khi làm theo nó, bạn đã tạo thành công ứng dụng Flask để quản lý các mục việc cần làm, sắp xếp các mục trong danh sách và thêm các mục mới vào database . Trong hướng dẫn này, bạn sẽ thêm chức năng đánh dấu các mục việc cần làm là đã hoàn thành, chỉnh sửa và xóa các mục cũng như thêm danh sách mới vào database . Đến cuối hướng dẫn, ứng dụng của bạn sẽ bao gồm các node chỉnh sửa và xóa và gạch ngang cho những việc cần làm đã hoàn thành.

Ứng dụng Todo

Yêu cầu

Trước khi bắt đầu làm theo hướng dẫn này, bạn cần :

Bước 1 - Cài đặt ứng dụng web

Trong bước này, bạn sẽ cài đặt ứng dụng việc cần làm để sẵn sàng sửa đổi. Nếu bạn đã làm theo hướng dẫn trong phần yêu cầu và vẫn còn mã và môi trường ảo trong máy local của bạn , bạn có thể bỏ qua bước này.

Đầu tiên, hãy sử dụng Git để sao chép repository mã của hướng dẫn trước:

  • git clone https://github.com/do-community/flask-todo

Điều hướng đến flask-todo :

  • cd flask-todo

Sau đó, tạo một môi trường ảo mới:

  • python -m venv env

Kích hoạt môi trường:

  • source env/bin/activate

Cài đặt Bình:

  • pip install Flask

Sau đó, khởi tạo database bằng chương trình init_db.py :

  • python init_db.py

Tiếp theo, đặt các biến môi trường sau:

  • export FLASK_APP=app
  • export FLASK_ENV=development

FLASK_APP cho biết ứng dụng bạn hiện đang phát triển, trong trường hợp này là app.py FLASK_ENV chỉ định chế độ — đặt nó thành development cho chế độ phát triển, điều này sẽ cho phép bạn gỡ lỗi ứng dụng. (Hãy nhớ không sử dụng chế độ này trong môi trường production .)

Sau đó chạy server phát triển:

  • flask run

Nếu bạn truy cập trình duyệt của bạn , bạn sẽ thấy ứng dụng đang chạy trên URL sau tại http://127.0.0.1:5000/ .

Để đóng server phát triển, hãy sử dụng tổ hợp CTRL + C

Tiếp theo, bạn sẽ sửa đổi ứng dụng để thêm khả năng đánh dấu các mục là hoàn chỉnh.

Bước 2 - Đánh dấu các việc cần làm là Hoàn thành

Trong bước này, bạn sẽ thêm một nút để đánh dấu từng mục việc cần làm là hoàn thành.

Để có thể đánh dấu các mục là hoàn thành, bạn sẽ thêm một cột mới vào bảng items trong database của bạn để có một điểm đánh dấu cho từng mục để bạn biết liệu nó đã hoàn thành hay chưa, sau đó bạn sẽ tạo một lộ trình mới trong app.py của bạn app.py để thay đổi giá trị của cột này tùy thuộc vào hành động của user .

Xin nhắc lại các cột trong bảng items hiện như sau:

  • id : ID của mặt hàng.
  • list_id : ID của danh sách mà mục đó thuộc về.
  • created : Ngày tạo của mặt hàng.
  • content : content của mục.

Trước tiên, hãy mở schema.sql để sửa đổi bảng items :

  • nano schema.sql

Thêm một cột mới có tên là done vào bảng items :

flask_todo / schema.sql
DROP TABLE IF EXISTS lists; DROP TABLE IF EXISTS items;  CREATE TABLE lists (     id INTEGER PRIMARY KEY AUTOINCREMENT,     created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,     title TEXT NOT NULL );  CREATE TABLE items (     id INTEGER PRIMARY KEY AUTOINCREMENT,     list_id INTEGER NOT NULL,     created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,     content TEXT NOT NULL,     done INTEGER NOT NULL DEFAULT 0,     FOREIGN KEY (list_id) REFERENCES lists (id) ); 

Lưu và đóng file .

Cột mới này sẽ chứa các giá trị nguyên 0 hoặc 1 ; giá trị 0 đại diện cho giá trị Boolean false1 đại diện cho giá trị true . Giá trị mặc định là 0 , nghĩa là bất kỳ mục mới nào bạn thêm sẽ tự động chưa hoàn thành cho đến khi user đánh dấu mục đó là hoàn thành, trong trường hợp đó, giá trị của cột đã done sẽ thay đổi thành 1 .

Sau đó, khởi tạo lại database bằng chương trình init_db.py để áp dụng các sửa đổi bạn đã thực hiện trên schema.sql :

  • python init_db.py

Tiếp theo, mở app.py để sửa đổi:

  • nano app.py

Bạn sẽ tìm nạp id của mục và giá trị của cột đã done trong hàm index() , hàm này tìm nạp danh sách và mục từ database và gửi chúng đến index.html để hiển thị. Những thay đổi cần thiết đối với câu lệnh SQL được đánh dấu trong file sau:

flask_todo / app.py
@app.route('/') def index():     conn = get_db_connection()     todos = conn.execute('SELECT i.id, i.done, i.content, l.title \                           FROM items i JOIN lists l \                           ON i.list_id = l.id ORDER BY l.title;').fetchall()      lists = {}      for k, g in groupby(todos, key=lambda t: t['title']):         lists[k] = list(g)      conn.close()     return render_template('index.html', lists=lists) 

Lưu và đóng file .

Với sửa đổi này, bạn nhận được ID của các mục việc cần làm bằng i.id và các giá trị của cột done bằng i.done .

Để hiểu thay đổi này, hãy mở list_example.py , đây là một chương trình mẫu nhỏ mà bạn có thể sử dụng để hiểu nội dung của database :

  • nano list_example.py

Thực hiện sửa đổi tương tự đối với câu lệnh SQL như trước, sau đó thay đổi hàm print() cuối cùng để hiển thị ID mục và giá trị của done :

flask_todo / list_example.py
from itertools import groupby from app import get_db_connection  conn = get_db_connection()  todos = conn.execute('SELECT i.id, i.done, i.content, l.title \                       FROM items i JOIN lists l \                       ON i.list_id = l.id ORDER BY l.title;').fetchall()  lists = {}  for k, g in groupby(todos, key=lambda t: t['title']):     lists[k] = list(g)  for list_, items in lists.items():     print(list_)     for item in items:         print('    ', item['content'], '| id:',               item['id'], '| done:', item['done']) 

Lưu và thoát khỏi file .

Chạy chương trình ví dụ:

  • python list_example.py

Đây là kết quả :

Output
Home      Buy fruit | id: 2 | done: 0      Cook dinner | id: 3 | done: 0 Study      Learn Flask | id: 4 | done: 0      Learn SQLite | id: 5 | done: 0 Work      Morning meeting | id: 1 | done: 0 

Không có mục nào được đánh dấu là đã hoàn thành nên giá trị đã done cho mỗi mục là 0 , nghĩa là false . Để cho phép user thay đổi giá trị này và đánh dấu các mục là đã hoàn thành, bạn sẽ thêm một tuyến đường mới vào file app.py

Mở app.py :

  • nano app.py

Thêm một tuyến đường /do/ vào cuối file :

flask_todo / app.py
. . . @app.route('/<int:id>/do/', methods=('POST',)) def do(id):     conn = get_db_connection()     conn.execute('UPDATE items SET done = 1 WHERE id = ?', (id,))     conn.commit()     conn.close()     return redirect(url_for('index')) 

Tuyến đường mới này chỉ chấp nhận các yêu cầu POST . Hàm do() view nhận đối số id — đây là ID của mục bạn muốn đánh dấu là đã hoàn thành. Bên trong hàm, bạn mở một kết nối database , sau đó bạn sử dụng câu lệnh UPDATE SQL để đặt giá trị của cột done thành 1 cho mục được đánh dấu là đã hoàn thành.

Bạn sử dụng ? trình giữ chỗ trong phương thức execute() và chuyển một tuple chứa ID để chèn dữ liệu vào database một cách an toàn. Sau đó, bạn thực hiện giao dịch và đóng kết nối và chuyển hướng đến trang index .

Sau khi thêm một tuyến đường để đánh dấu các mục là đã hoàn thành, bạn cần một tuyến đường khác để hoàn tác hành động này và đưa mục đó về trạng thái chưa hoàn thành. Thêm tuyến đường sau vào cuối file :

flask_todo / app.py
. . . @app.route('/<int:id>/undo/', methods=('POST',)) def undo(id):     conn = get_db_connection()     conn.execute('UPDATE items SET done = 0 WHERE id = ?', (id,))     conn.commit()     conn.close()     return redirect(url_for('index')) 

Tuyến đường này tương tự như /do/ route và hàm undo() xem hoàn toàn giống với hàm do() ngoại trừ việc bạn đặt giá trị của done thành 0 thay vì 1 .

Lưu file app.py

Đến đây bạn cần một nút để đánh dấu các mục việc cần làm là đã hoàn thành hoặc chưa hoàn thành tùy thuộc vào trạng thái của mục, hãy mở index.html mẫu index.html :

  • nano templates/index.html

Thay đổi nội dung của vòng lặp for bên trong bên trong phần tử <ul> trông như sau:

flask_todo / templates / index.html
{% block content %}     <h1>{% block title %} Welcome to FlaskTodo {% endblock %}</h1>     {% for list, items in lists.items() %}         <div class="card" style="width: 18rem; margin-bottom: 50px;">             <div class="card-header">                 <h3>{{ list }}</h3>             </div>             <ul class="list-group list-group-flush">                 {% for item in items %}                     <li class="list-group-item"                     {% if item['done'] %}                     style="text-decoration: line-through;"                     {% endif %}                     >{{ item['content'] }}                     {% if not item ['done'] %}                         {% set URL = 'do' %}                         {% set BUTTON = 'Do' %}                     {% else %}                         {% set URL = 'undo' %}                         {% set BUTTON = 'Undo' %}                     {% endif %}                      <div class="row">                         <div class="col-12 col-md-3">                             <form action="{{ url_for(URL, id=item['id']) }}"                                 method="POST">                                 <input type="submit" value="{{ BUTTON }}"                                     class="btn btn-success btn-sm">                             </form>                         </div>                     </div>                     </li>                 {% endfor %}             </ul>         </div>     {% endfor %} {% endblock %} 

Trong vòng lặp for này, bạn sử dụng giá trị CSS line-through cho thuộc tính text-decoration nếu mục được đánh dấu là đã hoàn thành, mà bạn biết từ giá trị của item['done'] . Sau đó bạn sử dụng cú pháp Jinja set để khai báo hai biến, URLBUTTON . Nếu mục không được đánh dấu là đã hoàn thành, nút sẽ có giá trị Do và URL sẽ chuyển hướng đến /do/ route, và nếu mục được đánh dấu là đã hoàn thành, nút sẽ có giá trị Hoàn tác và sẽ trỏ đến /undo/ . Sau đó, bạn sử dụng cả hai biến này trong một biểu mẫu input gửi yêu cầu thích hợp tùy thuộc vào trạng thái của mục.

Chạy server :

  • flask run

Đến đây bạn có thể đánh dấu các mục là đã hoàn thành trên trang index http://127.0.0.1:5000/ . Tiếp theo bạn sẽ thêm khả năng chỉnh sửa các mục cần làm.

Bước 3 - Chỉnh sửa các việc cần làm

Trong bước này, bạn sẽ thêm một trang mới để chỉnh sửa các mục để bạn có thể sửa đổi nội dung của từng mục và gán các mục vào các danh sách khác nhau.

Bạn sẽ thêm /edit/ route vào file app.py , file này sẽ hiển thị một trang edit.html mới trong đó user có thể sửa đổi các mục hiện có. Bạn cũng sẽ cập nhật index.html để thêm nút Edit cho từng mục.

Đầu tiên, hãy mở file app.py :

  • nano app.py

Sau đó, thêm tuyến đường sau vào cuối file :

flask_todo / app.py
. . . @app.route('/<int:id>/edit/', methods=('GET', 'POST')) def edit(id):     conn = get_db_connection()      todo = conn.execute('SELECT i.id, i.list_id, i.done, i.content, l.title \                          FROM items i JOIN lists l \                          ON i.list_id = l.id WHERE i.id = ?', (id,)).fetchone()      lists = conn.execute('SELECT title FROM lists;').fetchall()      if request.method == 'POST':         content = request.form['content']         list_title = request.form['list']          if not content:             flash('Content is required!')             return redirect(url_for('edit', id=id))          list_id = conn.execute('SELECT id FROM lists WHERE title = (?);',                                  (list_title,)).fetchone()['id']          conn.execute('UPDATE items SET content = ?, list_id = ?\                       WHERE id = ?',                      (content, list_id, id))         conn.commit()         conn.close()         return redirect(url_for('index'))      return render_template('edit.html', todo=todo, lists=lists) 

Trong chức năng xem mới này, bạn sử dụng đối số id để tìm nạp ID của mục việc cần làm mà bạn muốn chỉnh sửa, ID của danh sách thuộc về nó, giá trị của cột đã done , nội dung của mục và tiêu đề danh sách bằng cách sử dụng SQL JOIN . Bạn lưu dữ liệu này trong biến todo . Sau đó, bạn lấy tất cả danh sách việc cần làm từ database và lưu chúng trong biến lists .

Nếu yêu cầu là một yêu cầu GET bình thường, điều kiện if request.method == 'POST' không chạy, vì vậy việc áp dụng thực hiện cuối cùng render_template() chức năng, vượt qua cả todolists một edit.html file .

Tuy nhiên, nếu một biểu mẫu đã được gửi, điều kiện request.method == 'POST' sẽ trở thành true , trong trường hợp đó bạn extract nội dung và tiêu đề danh sách mà user đã gửi. Nếu không có nội dung nào được gửi, bạn nhấp vào thông báo Content is required! và chuyển hướng đến cùng một trang chỉnh sửa. Nếu không, bạn lấy ID của danh sách mà user đã gửi; điều này cho phép user di chuyển một mục công việc từ danh sách này sang danh sách khác. Sau đó, bạn sử dụng câu lệnh UPDATE SQL để đặt nội dung của mục việc cần làm thành nội dung mới mà user đã gửi. Bạn làm tương tự đối với ID danh sách. Cuối cùng, bạn commit các thay đổi và đóng kết nối, đồng thời chuyển hướng user đến trang index .

Lưu và đóng file .

Để sử dụng tuyến đường mới này, bạn cần một file mẫu mới có tên là edit.html :

  • nano templates/edit.html

Thêm các nội dung sau vào file mới này:

flask_todo / templates / edit.html
{% extends 'base.html' %}  {% block content %}  <h1>{% block title %} Edit an Item {% endblock %}</h1>  <form method="post">     <div class="form-group">         <label for="content">Content</label>         <input type="text" name="content"                placeholder="Todo content" class="form-control"                value="{{ todo['content'] or request.form['content'] }}"></input>     </div>      <div class="form-group">         <label for="list">List</label>         <select class="form-control" name="list">             {% for list in lists %}                 {% if list['title'] == request.form['list'] %}                     <option value="{{ request.form['list'] }}" selected>                         {{ request.form['list'] }}                     </option>                  {% elif list['title'] == todo['title'] %}                     <option value="{{ todo['title'] }}" selected>                         {{ todo['title'] }}                     </option>                  {% else %}                     <option value="{{ list['title'] }}">                         {{ list['title'] }}                     </option>                 {% endif %}             {% endfor %}         </select>     </div>     <div class="form-group">         <button type="submit" class="btn btn-primary">Submit</button>     </div> </form> {% endblock %} 

Bạn sử dụng giá trị {{ todo['content'] or request.form['content'] }} cho đầu vào nội dung. Điều này biểu thị rằng giá trị sẽ là nội dung hiện tại của mục việc cần làm hoặc những gì user đã gửi trong lần gửi biểu mẫu không thành công.

Đối với biểu mẫu chọn danh sách, bạn lặp qua biến lists và nếu tiêu đề danh sách giống với tiêu đề được lưu trữ trong đối tượng request.form (từ một lần thử không thành công), thì hãy đặt tiêu đề danh sách đó làm giá trị đã chọn. Nếu không, nếu tiêu đề danh sách bằng một trong những lưu trong todo biến, sau đó đặt nó như là giá trị được chọn. Đây là tiêu đề danh sách hiện tại của mục việc cần làm trước khi có bất kỳ sửa đổi nào; phần còn lại của các tùy chọn sau đó được hiển thị mà không có thuộc tính selected .

Lưu và đóng file .

Sau đó, mở index.html để thêm nút Edit :

  • nano templates/index.html

Thay đổi nội dung của thẻ div với lớp "row" để thêm một cột khác như sau:

flask_todo / templates / index.html
. . . <div class="row">     <div class="col-12 col-md-3">         <form action="{{ url_for(URL, id=item['id']) }}"             method="POST">             <input type="submit" value="{{ BUTTON }}"                 class="btn btn-success btn-sm">         </form>     </div>     <div class="col-12 col-md-3">         <a class="btn btn-warning btn-sm"         href="{{ url_for('edit', id=item['id']) }}">Edit</a>     </div> </div> 

Lưu và đóng file .

Đây là thẻ liên kết <a> tiêu chuẩn trỏ đến /edit/ lộ trình có liên quan cho từng mục.

Chạy server nếu bạn chưa:

  • flask run

Đến đây bạn có thể truy cập trang index http://127.0.0.1:5000/ và thử nghiệm sửa đổi các mục việc cần làm. Trong bước tiếp theo, bạn sẽ thêm một nút để xóa các mục.

Bước 4 - Xóa các việc cần làm

Trong bước này, bạn sẽ thêm khả năng xóa các mục việc cần làm cụ thể.

Trước tiên, bạn cần thêm một /delete/ route mới, hãy mở app.py :

  • nano app.py

Sau đó, thêm tuyến đường sau vào cuối file :

flask_todo / app.py
. . . @app.route('/<int:id>/delete/', methods=('POST',)) def delete(id):     conn = get_db_connection()     conn.execute('DELETE FROM items WHERE id = ?', (id,))     conn.commit()     conn.close()     return redirect(url_for('index')) 

Lưu và đóng file .

Hàm xem delete() chấp nhận một đối số id . Khi một yêu cầu POST được gửi đi, bạn sử dụng câu lệnh DELETE SQL để xóa mục có giá trị id phù hợp, sau đó bạn thực hiện giao dịch và đóng kết nối database , rồi quay lại trang index .

Tiếp theo, mở templates/index.html để thêm nút Delete :

  • nano templates/index.html

Thêm thẻ div đánh dấu sau vào bên dưới nút Edit :

flask_todo / templates / index.html
<div class="row">     <div class="col-12 col-md-3">         <form action="{{ url_for(URL, id=item['id']) }}"             method="POST">             <input type="submit" value="{{ BUTTON }}"                 class="btn btn-success btn-sm">         </form>     </div>      <div class="col-12 col-md-3">         <a class="btn btn-warning btn-sm"         href="{{ url_for('edit', id=item['id']) }}">Edit</a>     </div>      <div class="col-12 col-md-3">         <form action="{{ url_for('delete', id=item['id']) }}"             method="POST">             <input type="submit" value="Delete"                 class="btn btn-danger btn-sm">         </form>     </div> </div> 

Nút gửi mới này sẽ gửi một yêu cầu ĐĂNG đến /delete/ lộ trình cho từng mục.

Lưu và đóng file .

Sau đó chạy server phát triển:

  • flask run

Đi tới trang index và thử nút Delete mới — giờ đây bạn có thể xóa bất kỳ mục nào bạn muốn.

Đến đây bạn đã thêm khả năng xóa các mục việc cần làm hiện có, bạn sẽ chuyển sang thêm khả năng thêm danh sách mới trong bước tiếp theo.

Bước 5 - Thêm danh sách mới

Lúc này, danh sách chỉ có thể được thêm trực tiếp từ database . Trong bước này, bạn sẽ thêm khả năng tạo danh sách mới khi user thêm một mục mới, thay vì chỉ chọn giữa các danh sách hiện có. Bạn sẽ kết hợp một tùy chọn mới có tên là New List , khi được chọn, user có thể nhập tên của danh sách mới mà họ muốn tạo.

Đầu tiên, hãy mở app.py :

  • nano app.py

Sau đó, sửa đổi chức năng xem create() bằng cách thêm các dòng được đánh dấu sau vào điều kiện if request.method == 'POST' :

flask_todo / app.py
. . . @app.route('/create/', methods=('GET', 'POST')) def create():     conn = get_db_connection()      if request.method == 'POST':         content = request.form['content']         list_title = request.form['list']          new_list = request.form['new_list']          # If a new list title is submitted, add it to the database         if list_title == 'New List' and new_list:             conn.execute('INSERT INTO lists (title) VALUES (?)',                          (new_list,))             conn.commit()             # Update list_title to refer to the newly added list             list_title = new_list          if not content:             flash('Content is required!')             return redirect(url_for('index'))          list_id = conn.execute('SELECT id FROM lists WHERE title = (?);',                                  (list_title,)).fetchone()['id']         conn.execute('INSERT INTO items (content, list_id) VALUES (?, ?)',                      (content, list_id))         conn.commit()         conn.close()         return redirect(url_for('index'))      lists = conn.execute('SELECT title FROM lists;').fetchall()      conn.close()     return render_template('create.html', lists=lists) 

Lưu và đóng file .

Tại đây, bạn lưu giá trị của một trường biểu mẫu mới được gọi là new_list trong một biến. Bạn sẽ thêm trường này sau đó vào file create.html . Tiếp theo, trong điều list_title == 'New List' and new_list , bạn kiểm tra xem liệu list_title có giá trị 'New List' , điều này cho biết user muốn tạo một danh sách mới. Bạn cũng kiểm tra xem giá trị của biến new_list không phải là None , nếu điều kiện này được đáp ứng, bạn sử dụng INSERT INTO SQL để thêm tiêu đề danh sách mới gửi vào bảng lists . Bạn thực hiện giao dịch, sau đó bạn cập nhật giá trị của biến list_title để trùng với giá trị của danh sách mới được thêm vào để sử dụng sau này.

Tiếp theo, mở create.html để thêm <option> mới để user thêm danh sách mới:

  • nano templates/create.html

Sửa đổi file bằng cách thêm các thẻ được đánh dấu trong mã sau:

flask_todo / templates / create.html
    <div class="form-group">         <label for="list">List</label>         <select class="form-control" name="list">             <option value="New List" selected>New List</option>             {% for list in lists %}                 {% if list['title'] == request.form['list'] %}                     <option value="{{ request.form['list'] }}" selected>                         {{ request.form['list'] }}                     </option>                 {% else %}                     <option value="{{ list['title'] }}">                         {{ list['title'] }}                     </option>                 {% endif %}             {% endfor %}         </select>     </div>      <div class="form-group">         <label for="new_list">New List</label>         <input type="text" name="new_list"                 placeholder="New list name" class="form-control"                 value="{{ request.form['new_list'] }}"></input>     </div>      <div class="form-group">         <button type="submit" class="btn btn-primary">Submit</button>     </div> 

Lưu và đóng file .

Bạn đã thêm một <option> để tham chiếu đến tùy chọn New List , điều này sẽ cho phép user chỉ định rằng họ muốn tạo một danh sách mới. Sau đó, bạn thêm một <div> với trường nhập có tên new_list , trường này là nơi user sẽ nhập tiêu đề của danh sách mới mà họ muốn tạo.

Cuối cùng, chạy server phát triển:

  • flask run

Sau đó truy cập trang index :

http://127.0.0.1:5000/ 

Ứng dụng bây giờ sẽ trông như sau:

Ứng dụng Todo

Với những bổ sung mới cho ứng dụng của bạn, giờ đây user có thể đánh dấu các mục công việc là hoàn thành hoặc khôi phục các mục đã hoàn thành về trạng thái chưa hoàn thành, chỉnh sửa và xóa các mục hiện có cũng như tạo danh sách mới cho các loại công việc cần làm khác nhau.

Bạn có thể duyệt qua mã nguồn đầy đủ của ứng dụng trong Kho lưu trữ cộng đồng DigitalOcean .

Kết luận

Như vậy, bạn có một ứng dụng việc cần làm hoàn chỉnh, trong đó user có thể tạo các mục việc cần làm mới, đánh dấu một mục là hoàn thành và chỉnh sửa hoặc xóa các mục hiện có, ngoài khả năng tạo danh sách mới. Bạn đã sửa đổi ứng dụng web Flask, thêm các tính năng mới vào ứng dụng đó và sửa đổi các mục database cụ thể trong mối quan hệ Một-nhiều. Bạn có thể phát triển ứng dụng này hơn nữa bằng cách tìm hiểu Cách Thêm Xác thực vào Ứng dụng của Bạn với Đăng nhập Flask để thêm bảo mật cho ứng dụng Flask của bạn.


Tags:

Các tin liên quan

Cách sử dụng mối quan hệ một-nhiều database với Flask và SQLite
2020-06-22
Cách kết nối với dịch vụ database trên Ubuntu 18.04
2020-06-16
Cách tạo ứng dụng Django và kết nối nó với database
2020-05-07
Cách sử dụng Di chuyển database và Trình seeding để Thiết lập database Tóm tắt trong Laravel
2020-02-13
Cách tạo một ứng dụng lập hóa đơn đơn giản với node: database và API
2019-12-12
Cách cài đặt WordPress với dịch vụ database trên Ubuntu 18.04
2019-08-20
Dịch vụ Database online
2019-02-14
Tìm hiểu database phân đoạn - Database Sharding
2019-02-07
Cách thiết lập database từ xa để tối ưu hóa hiệu suất trang web với MySQL trên Ubuntu 18.04
2018-11-28
Cách quản lý database SQL
2018-09-26