成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flask 的 Blueprints 和 Views

開發 前端
url_for根據view名字來獲取url,因為這里用到了Blueprint,所以入參是"auth.login"。如果沒有用Blueprint,url_for()函數入參就寫view函數名即可。

[[437021]]

本文轉載自微信公眾號「dongfanger」,作者dongfanger。轉載本文請聯系dongfanger公眾號。

 Flask的view函數是用來對請求作出響應的。單個URL能匹配到單個View,那么多個類似的URL,比如:

  1. /auth/register 
  2. /auth/login 
  3. /auth/logout 

有沒有什么比較優雅的寫法呢?

Blueprints

Blueprints就是一個路由分組,可以把共同的路由前綴注冊為一個Blueprint,比如:

在flaskr/auth.py文件中先定義一個Blueprint:

  1. import functools 
  2.  
  3. from flask import ( 
  4.     Blueprint, flash, g, redirect, render_template, request, session, url_for 
  5. from werkzeug.security import check_password_hash, generate_password_hash 
  6.  
  7. from flaskr.db import get_db 
  8.  
  9. bp = Blueprint('auth', __name__, url_prefix='/auth'
  • 'auth'是Blueprint的名字。
  • __name__用來告訴Blueprint它的定義位置。
  • url_prefix就是路由前綴。

接著在flaskr/__init__.py文件中注冊:

  1. def create_app(): 
  2.     app = ... 
  3.     # existing code omitted 
  4.  
  5.     from . import auth 
  6.     app.register_blueprint(auth.bp) 
  7.  
  8.     return app 

Views

定義和注冊了Blueprints后就可以在view中使用了。比如:

①在flaskr/auth.py文件中添加一個注冊view:

  1. @bp.route('/register', methods=('GET''POST')) 
  2. def register(): 
  3.     if request.method == 'POST'
  4.         username = request.form['username'
  5.         password = request.form['password'
  6.         db = get_db() 
  7.         error = None 
  8.  
  9.         if not username: 
  10.             error = 'Username is required.' 
  11.         elif not password
  12.             error = 'Password is required.' 
  13.  
  14.         if error is None: 
  15.             try: 
  16.                 db.execute
  17.                     "INSERT INTO user (username, password) VALUES (?, ?)"
  18.                     (username, generate_password_hash(password)), 
  19.                 ) 
  20.                 db.commit() 
  21.             except db.IntegrityError: 
  22.                 error = f"User {username} is already registered." 
  23.             else
  24.                 return redirect(url_for("auth.login")) 
  25.  
  26.         flash(error) 
  27.  
  28.     return render_template('auth/register.html'
  • @bp.route就會把路由前綴加到'/register'上拼成/auth/register。
  • request.form是一個字典,可以讀取接口入參。
  • db.execute執行SQL語句。db.commit()提交。
  • redirect在注冊成功后重定向到登錄頁面。
  • url_for根據view名字來獲取url,因為這里用到了Blueprint,所以入參是"auth.login"。如果沒有用Blueprint,url_for()函數入參就寫view函數名即可。

②在flaskr/auth.py文件中添加一個登錄view:

  1. @bp.route('/login', methods=('GET''POST')) 
  2. def login(): 
  3.     if request.method == 'POST'
  4.         username = request.form['username'
  5.         password = request.form['password'
  6.         db = get_db() 
  7.         error = None 
  8.         user = db.execute
  9.             'SELECT * FROM user WHERE username = ?', (username,) 
  10.         ).fetchone() 
  11.  
  12.         if user is None: 
  13.             error = 'Incorrect username.' 
  14.         elif not check_password_hash(user['password'], password): 
  15.             error = 'Incorrect password.' 
  16.  
  17.         if error is None: 
  18.             session.clear() 
  19.             session['user_id'] = user['id'
  20.             return redirect(url_for('index')) 
  21.  
  22.         flash(error) 
  23.  
  24.     return render_template('auth/login.html'
  • fetchone()取一行數據,fetchall()取多行數據。
  • 登錄成功后會把user_id存入session中,session是一個字典,這樣后續請求就可以用到這個數據。比如:
  1. @bp.before_app_request 
  2. def load_logged_in_user(): 
  3.     user_id = session.get('user_id'
  4.  
  5.     if user_id is None: 
  6.         g.user = None 
  7.     else
  8.         g.user = get_db().execute
  9.             'SELECT * FROM user WHERE id = ?', (user_id,) 
  10.         ).fetchone() 

值得注意的是@bp.before_app_request有點像setup,就是在所有請求前先運行這一段代碼。

③在flaskr/auth.py文件中添加一個登出view:

  1. flaskr/auth.py 
  2. @bp.route('/logout'
  3. def logout(): 
  4.     session.clear() 
  5.     return redirect(url_for('index')) 
  • session.clear()清除session。

④最后可以在在flaskr/auth.py文件中順手寫一個裝飾器,用來做認證鑒權:

  1. def login_required(view): 
  2.     @functools.wraps(view
  3.     def wrapped_view(**kwargs): 
  4.         if g.user is None: 
  5.             return redirect(url_for('auth.login')) 
  6.  
  7.         return view(**kwargs) 
  8.  
  9.     return wrapped_view 

在需要登錄才能訪問的view上,就可以加上這個login_required裝飾器。

參考資料:

https://flask.palletsprojects.com/en/2.0.x/tutorial/views/

 

責任編輯:武曉燕 來源: dongfanger
相關推薦

2022-05-30 06:30:20

查詢MySQL數據庫

2012-06-07 09:21:55

ibmdw

2015-07-30 09:49:33

Table ViewsTips加速

2015-07-29 10:11:18

Tableviews加速開發

2023-06-07 08:18:25

2023-03-27 15:07:27

PythonWeb 開發編程語言

2024-09-29 10:34:31

FlaskPythonAPI

2022-03-28 18:59:02

DockerFlask深度學習

2023-08-27 15:10:29

Django和Flask框架

2016-11-08 10:24:37

FlaskPython插件

2019-05-15 13:48:17

PythonDjangoFlask

2023-06-08 08:13:43

2023-06-30 08:54:39

2021-08-19 07:25:02

數據庫Flask插件

2023-10-09 18:17:52

Python語言Web

2017-05-11 14:00:02

Flask請求上下文應用上下文

2023-06-28 08:08:06

Flask上下文生命周期

2022-02-16 07:47:48

flask分頁SQLAlchemy

2022-06-21 09:27:01

PythonFlaskREST API

2022-08-31 15:09:03

PythonOthers
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 亚洲色在线视频 | 国产99久久精品一区二区300 | 国产精品久久久久久久久久久久午夜片 | 国产9 9在线 | 中文 | 国产精品一区二区三 | 台湾a级理论片在线观看 | 尹人av | 国户精品久久久久久久久久久不卡 | 一区二区三区不卡视频 | 成人永久免费 | 国产日韩欧美精品 | 狠狠色综合网站久久久久久久 | 粉嫩av| 亚洲黄色一级毛片 | 欧美一区二区三区的 | 国产精彩视频 | 91国产精品| 九九热精品视频 | 欧美成人在线免费 | 久久精品亚洲精品国产欧美 | 欧美精品一区二区三区在线播放 | 成人久久久 | 亚洲男人网 | 大伊人久久 | 91日韩 | 一区在线视频 | 国产福利91精品 | 天堂va在线观看 | 看特级黄色片 | 99精品免费久久久久久久久日本 | 天堂在线免费视频 | 欧美国产亚洲一区二区 | 成年人免费网站 | 亚洲精品成人av | 亚州国产 | 亚洲永久 | 99久久免费精品视频 | 中文字幕一区二区三区在线乱码 | 日韩成人免费中文字幕 | www.三级 |