1. 程式人生 > 實用技巧 >1.1建立超管以及登入渲染

1.1建立超管以及登入渲染

1、這裡我們建立超級管理員是用指令碼來建立的指令碼可以理解為函式

  我們在manage.py這個檔案中建立

 1 #manager可以在終端使用指令操縱程式,option可以加引數
 2 @manager.option("-u","--name",dest="username")
 3 @manager.option("-p","--password",dest="password")
 4 @manager.option("-m","--moblie",dest="moblie")
 5 #建立可以超管函式,並用形參接收
 6 def createsuperuser(username,password,moblie):
7 #判斷接收到的引數是否為空 8 if not all([username,password,moblie]): 9 print("缺少必要引數") 10 return 11 #例項化User模型列,並且邏輯新增 12 user = User() 13 user.nick_name = username 14 user.password = password 15 user.mobile = moblie 16 #寫入管理員許可權 17 user.is_admin = True 18 try
: 19 #提交到資料庫 20 db.session.add(user) 21 db.session.commit() 22 except Exception as e: 23 current_app.logger.error(e) 24 db.session.rollback() 25 print("超級管理員建立失敗")

建立完成後我們就可以在終(terminal)用指令新增超管了

D:\PythonCode\flask_all>python manager.py createsuperuser -u 超管名字 -p 密碼 -m 手機號

新增完就可以到資料庫查詢成功與否了

2、登入渲染

  2.1後臺程式碼

 1 @admin_blue.route('/index')
 2 @user_login_data
 3 def admin_index():
 4     user = g.user
 5     #判斷如果沒有登入使用者就跳轉到登入頁面
 6     if not user:
 7         return redirect(url_for("admin.admin_login"))
 8     context = {
 9         "user":user
10     }
11     return render_template("admin/index.html",context = context)
12 
13 @admin_blue.route('/login',methods=['GET','POST'])
14 @user_login_data
15 def admin_login():
16     user = g.user
17     #處理post請求
18     if request.method == "POST":
19         #接收引數
20         username = request.form.get("username")
21         password = request.form.get("password")
22         #判斷引數是否齊全
23         if not all([username,password]):
24             return render_template("admin/login.html",errmsg = "缺少引數")
25 
26         try:
27             #獲取使用者資訊
28             user = User.query.filter(User.nick_name == username).first()
29         except Exception as e:
30             current_app.logger.error(e)
31             return render_template("admin/login.html",errmsg = "資料庫查詢失敗")
32         if not user:
33             return render_template("admin/login.html",errmsg = "賬號或者密碼錯誤")
34         #判斷密碼
35         if not user.check_password(password):
36             return render_template("admin/login.html",errmsg = "賬號或者密碼錯誤")
37         user_id = session.get("id")
38         is_admin = session.get("is_admin")
39         #改變session實現登入
40         session["mobile"] = user.mobile
41         session["id"] = user.id
42         session["nick_name"] = user.nick_name
43         session["is_admin"] = True
44         return redirect(url_for("admin.admin_index"))
45     return  render_template("admin/login.html")

  2.2前端程式碼

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>新經資訊後臺管理</title>
 6     <link rel="stylesheet" type="text/css" href="../../static/admin/css/reset.css">
 7     <link rel="stylesheet" type="text/css" href="../../static/admin/css/main.css">
 8 </head>
 9 <body>
10     <div class="login_logo">
11         <img src="../../static/admin/images/logo.png" alt="">
12     </div>    
13     <form method="post" class="login_form">
14         <h1 class="login_title">使用者登入</h1>
15 {#        <input type="hidden" name="csrf_token" value = "{{ csrf_token() }}">#}
16         <input type="text" name="username" placeholder="使用者名稱" class="input_txt">
17         <input type="password" name="password" placeholder="密碼" class="input_txt">
18         {% if errmsg %}
19             <div class="error_tip"style="display: block">{{ errmsg }}</div>
20         {% endif %}
21 
22         <input type="submit" value="登 錄" class="input_sub">
23     </form>
24     <div class="login_bg"></div>
25 </body>
26 </html>

3、處理邏輯反覆請求

  我們再init中加入中間鍵

 1 @admin_blue.before_request
 2 def before_request():
 3     #如果路徑結束不是以我們呼叫的檢視函式結束時:
 4     if not request.url.endswith(url_for("admin.admin_login")):
 5         #獲取使用者的session值
 6         user_id = session.get("id")
 7         is_admin = session.get("is_admin")
 8         #判斷有沒有值和是不是超級管理員
 9         if not user_id or not is_admin:
10             #如果不是返回登入介面
11             return redirect(url_for("admin.admin_login"))

其中裝飾器@admin_blue.before_request中before_request意思為再請求之前