flask 開發用戶登錄注冊功能
flask開發過程議案需要四個模塊:html頁面模板、form表單、db數據庫操作、app視圖函數
1.主程序
# app.py # Auther: hhh5460 # Time: 2018/10/05 # Address: DongGuan YueHua from functools import wraps from flask import Flask, request, render_template, redirect, url_for, flash, session from flask_sqlalchemy import SQLAlchemy from sqlalchemy import and_, or_ app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True app.secret_key = '\xc9ixnRb\xe40\xd4\xa5\x7f\x03\xd0y6\x01\x1f\x96\xeao+\x8a\x9f\xe4' db = SQLAlchemy(app) ############################################ # 數據庫 ############################################ # 定義ORM class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) password = db.Column(db.String(80)) email = db.Column(db.String(120), unique=True) def __repr__(self): return '<User %r>' % self.username # 創建表格、插入數據 @app.before_first_request def create_db(): db.drop_all() # 每次運行,先刪除再創建 db.create_all() admin = User(username='admin', password='root', email='admin@example.com') db.session.add(admin) guestes = [User(username='guest1', password='guest1', email='guest1@example.com'), User(username='guest2', password='guest2', email='guest2@example.com'), User(username='guest3', password='guest3', email='guest3@example.com'), User(username='guest4', password='guest4', email='guest4@example.com')] db.session.add_all(guestes) db.session.commit() ############################################ # 輔助函數、裝飾器 ############################################ # 登錄檢驗(用戶名、密碼驗證) def valid_login(username, password): user = User.query.filter(and_(User.username == username, User.password == password)).first() if user: return True else: return False # 注冊檢驗(用戶名、郵箱驗證) def valid_regist(username, email): user = User.query.filter(or_(User.username == username, User.email == email)).first() if user: return False else: return True # 登錄 def login_required(func): @wraps(func) def wrapper(*args, **kwargs): # if g.user: if session.get('username'): return func(*args, **kwargs) else: return redirect(url_for('login', next=request.url)) # return wrapper ############################################ # 路由 ############################################ # 1.主頁 @app.route('/') def home(): return render_template('home.html', username=session.get('username')) # 2.登錄 @app.route('/login', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': if valid_login(request.form['username'], request.form['password']): flash("成功登錄!") session['username'] = request.form.get('username') return redirect(url_for('home')) else: error = '錯誤的用戶名或密碼!' return render_template('login.html', error=error) # 3.注銷 @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('home')) # 4.注冊 @app.route('/regist', methods=['GET','POST']) def regist(): error = None if request.method == 'POST': if request.form['password1'] != request.form['password2']: error = '兩次密碼不相同!' elif valid_regist(request.form['username'], request.form['email']): user = User(username=request.form['username'], password=request.form['password1'], email=request.form['email']) db.session.add(user) db.session.commit() flash("成功注冊!") return redirect(url_for('login')) else: error = '該用戶名或郵箱已被注冊!' return render_template('regist.html', error=error) # 5.個人中心 @app.route('/panel') @login_required def panel(): username = session.get('username') user = User.query.filter(User.username == username).first() return render_template("panel.html", user=user) if __name__ == '__main__': app.run(debug = True)
2.主頁
<!-- templates/home.html --> <DOCTYPE html> <html lang="zh-han"> <head> <title>主頁</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/style.css" rel="stylesheet"> </head> <body> {% if username %} <p>{{username}},歡迎來到主頁! <a href="{{ url_for('panel') }}">個人中心</a> <a href="{{ url_for('logout') }}">注銷</a></p> {% else %} <p>歡迎來到主頁! <a href="{{ url_for('login') }}">登錄</a> <a href="{{ url_for('regist') }}">注冊</a></p> {% endif %} </body> </html>
3.登錄頁面
<!-- templates/login.html --> <DOCTYPE html> <html lang="zh-han"> <head> <title>登錄</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/style.css" rel="stylesheet"> </head> <body> <form method="post" action='/login'> <label>用戶名:<input type="text" name="username" value=""></label><br> <label>密碼:<input type="password" name="password" value=""></label><br> <input type="submit" value="登錄"> </form> {% if error %} <p>{{error}}</p> {% endif %} </body> </html>
4.注冊頁面
<!-- templates/regist.html --> <DOCTYPE html> <html lang="zh-han"> <head> <title>注冊</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/style.css" rel="stylesheet"> </head> <body> <form method="post" action='/regist'> <label>用戶名:<input type="text" name="username" value=""></label></br> <label>密碼:<input type="password" name="password1" value=""></label></br> <label>重復密碼:<input type="password" name="password2" value=""></label></br> <label>郵箱:<input type="email" name="email" value=""></label></br> <input type="submit" value="注冊"> </form> {% if error %} <p>{{error}}</p> {% endif %} </body> </html>
5.個人中心頁面
<!-- templates/panel.html --> <DOCTYPE html> <html lang="zh-han"> <head> <title>個人中心</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="css/style.css" rel="stylesheet"> </head> <body> <h3>個人中心</h3> <p>姓名:{{user.username}}</p> <p>密碼:{{user.password}}</p> <p>郵箱:{{user.email}}</p> </body> </html>
原文地址https://www.cnblogs.com/hhh5460/p/9745812.html