自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Flask 的 Blueprints 和 Views

開發(fā) 前端
url_for根據(jù)view名字來獲取url,因為這里用到了Blueprint,所以入?yún)⑹?quot;auth.login"。如果沒有用Blueprint,url_for()函數(shù)入?yún)⒕蛯憊iew函數(shù)名即可。

[[437021]]

本文轉(zhuǎn)載自微信公眾號「dongfanger」,作者dongfanger。轉(zhuǎn)載本文請聯(lián)系dongfanger公眾號。

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

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

有沒有什么比較優(yōu)雅的寫法呢?

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是一個字典,可以讀取接口入?yún)ⅰ?/li>
  • db.execute執(zhí)行SQL語句。db.commit()提交。
  • redirect在注冊成功后重定向到登錄頁面。
  • url_for根據(jù)view名字來獲取url,因為這里用到了Blueprint,所以入?yún)⑹?quot;auth.login"。如果沒有用Blueprint,url_for()函數(shù)入?yún)⒕蛯憊iew函數(shù)名即可。

②在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()取一行數(shù)據(jù),fetchall()取多行數(shù)據(jù)。
  • 登錄成功后會把user_id存入session中,session是一個字典,這樣后續(xù)請求就可以用到這個數(shù)據(jù)。比如:
  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文件中順手寫一個裝飾器,用來做認(rèn)證鑒權(quán):

  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/

 

責(zé)任編輯:武曉燕 來源: dongfanger
相關(guān)推薦

2022-05-30 06:30:20

查詢MySQL數(shù)據(jù)庫

2012-06-07 09:21:55

ibmdw

2015-07-30 09:49:33

Table ViewsTips加速

2015-07-29 10:11:18

Tableviews加速開發(fā)

2023-06-07 08:18:25

2023-03-27 15:07:27

PythonWeb 開發(fā)編程語言

2022-03-28 18:59:02

DockerFlask深度學(xué)習(xí)

2023-08-27 15:10:29

Django和Flask框架

2024-09-29 10:34:31

FlaskPythonAPI

2016-11-08 10:24:37

FlaskPython插件

2023-06-08 08:13:43

2019-05-15 13:48:17

PythonDjangoFlask

2023-06-30 08:54:39

2021-08-19 07:25:02

數(shù)據(jù)庫Flask插件

2023-10-09 18:17:52

Python語言Web

2017-05-11 14:00:02

Flask請求上下文應(yīng)用上下文

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技術(shù)棧公眾號