flask 開發用戶登錄注冊功能


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM