Python 基於Flask的Web開發【1】【用戶登錄 註冊】
阿新 • • 發佈:2019-03-20
html 追蹤 filter 數據庫對象 建數據庫 ali src 密碼錯誤 需要 實現目標
基於Flask實現用戶的登錄/註冊。
設計思路
- 前端
1.編寫登錄和註冊表單
2.編寫視圖函數
3.編寫相應的html文件
4.頁面測試 - 後臺
1.創建數據庫
2.修改配置文件
3.編寫數據表類並生成數據表
4.修改視圖函數,實現數據交互
前端實現
1.編寫登錄和註冊表單(/app/home/forms.py)
# 導入表單基類 from flask_wtf import FlaskForm # 導入需要用到的表格類型 from wtforms import StringField, PasswordField, SubmitField # 導入需要用的驗證方式 from wtforms.validators import DataRequired, EqualTo, Length, Email # 用戶註冊表單 class RegisterForm(FlaskForm): # 用戶名表框 username = StringField( label= ‘用戶名‘, # 標簽 validators=[ # 驗證方式 DataRequired() # 不能為空 ] ) # 密碼表框 password = PasswordField( label=‘密碼‘, validators=[ DataRequired(), Length(6,16,message=‘密碼長度應在6-16位‘) # 密碼長度必須在6-16,否則輸出提示信息 ] ) # 郵箱表框 email = StringField( label=‘郵箱‘, validators=[ DataRequired(), Email(message=‘郵箱不合法‘) ] ) # 註冊按鈕 submit = SubmitField( label=‘註冊‘ ) # 登錄表單 class LoginForm(FlaskForm): username = StringField( label=‘用戶名‘, validators=[ DataRequired() ] ) password = PasswordField( label=‘密碼‘, validators=[ Length(6, 16, message=‘密碼長度應在6-16位‘) ] ) submit = SubmitField( label=‘登錄‘ )
2.編寫視圖函數(/app/home/views.py)
from . import home_bp # 導入藍圖 from flask import render_template # 用於模板渲染 @home_bp.route(‘/‘) def index(): return render_template(‘index.html‘) @home_bp.route(‘/login/‘,methods =[‘GET‘,‘POST‘]) def login(): from app.home.forms import LoginForm form = LoginForm() return render_template(‘login.html‘,form=form) @home_bp.route(‘/register/‘,methods =[‘GET‘,‘POST‘]) def register(): from app.home.forms import RegisterForm form = RegisterForm() return render_template(‘register.html‘,form=form)
3.編寫相應的html文件
-
基模板(/app/templates/base.html)
為了統一頁面風格,繼承bootstrap/base.html,創建自己的基模板 -
登錄頁面(/app/templates/login.html)
登錄頁面,繼承自上面的base.html,並在content中生成登錄表單 - 註冊頁面(/app/templates/register.html)
註冊頁面,繼承自上面的base.html,並在content中生成註冊表單
4.測試效果
後臺實現
1.創建數據庫
在mysql shell中創建數據庫
2.修改配置文件
在配置文件中添加代碼如下:
# 數據庫配置 SQLALCHEMY_DATABASE_URI ="mysql://root:mysql@locallost/sentry" # 指定數據庫 SQLALCHEMY_TRACK_MODIFICATIONS = False # 關閉追蹤
3.編寫數據表類並生成數據表
在models.py中編寫數據表結構如下:
from app import db
# 用戶數據表
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(30),unique=True)
password = db.Column(db.String(300))
email = db.Column(db.String(40),unique=True)
def __repr__(self):
return "<User %s>"%self.name
在__init__.py中利用SQLAlchemy實例化數據庫對象
from flask_sqlalchemy import SQLAlchemy
import pymysql
# 數據庫報錯問題
pymysql.install_as_MySQLdb()
# 讀取配置文件的配置信息
app.config.from_pyfile(‘../config.py‘)
db = SQLAlchemy(app)
在manage.py中添加代碼如下:
from app import db # 導入數據庫對象
from werkzeug.security import generate_password_hash # 哈希加密
from app.models import User # 導入數據表類
@manager.command # 使函數可以作為命令在shell中直接執行
def db_init():
db.drop_all() # 刪除已有數據表
db.create_all() # 創建新數據表
admin = User(name=‘admin‘, password=generate_password_hash(‘admin‘)) # 實例化一個用戶對象
db.session.add(admin) # 添加入session
db.session.commit() # 提交給數據庫
print("數據庫初始化成功")
在python shell 中執行 python manage.py db_init 即可完成數據庫初始化
在mysql中查看
4.修改視圖函數,實現數據交互
from werkzeug.security import generate_password_hash # 哈希加密
from app import db
from . import home_bp # 導入藍圖
from flask import render_template, redirect, request, flash, session, url_for
@home_bp.route(‘/‘)
def index():
return render_template(‘index.html‘)
# 登錄
@home_bp.route(‘/login/‘,methods =[‘GET‘,‘POST‘])
def login():
from app.home.forms import LoginForm
from app.models import User
form = LoginForm()
if form.validate_on_submit():
# 獲取表單中的數據
username = form.username.data
password = form.password.data
# 在數據庫中查找
user = User.query.filter_by(name = username).first()
# 用戶名和密碼匹配成功時
if user and user.verify_password(password):
# 登陸成功將用戶信息添加到session信息中去
session[‘user‘]=user.name
session[‘id‘]= user.id
flash(‘登錄成功‘)
return redirect(url_for(‘home.index‘))
flash(‘用戶名或密碼錯誤‘)
return render_template(‘login.html‘,form=form)
# 註冊
@home_bp.route(‘/register/‘,methods =[‘GET‘,‘POST‘])
def register():
from app.home.forms import RegisterForm
from app.models import User
form = RegisterForm()
if form.validate_on_submit():
# 獲取表單中的數據
name = form.username.data
password = form.password.data
email = form.email.data
if User.query.filter_by(name=name).first():
flash(‘用戶名已存在‘)
return redirect(url_for(‘home.register‘))
if User.query.filter_by(email=email).first():
flash(‘郵箱已占用‘)
return redirect(url_for(‘home.register‘))
# 密碼進行哈希加密
user = User(name=name,password=generate_password_hash(password),email=email)
db.session.add(user)
db.session.commit()
flash(‘註冊成功,請登錄‘)
return redirect(url_for(‘home.login‘))
return render_template(‘register.html‘,form=form)
# 註銷
@home_bp.route(‘/logout/‘)
def logout():
# 清除session信息
session.clear()
return redirect(url_for(‘home.login‘))
部分測試結果
Python 基於Flask的Web開發【1】【用戶登錄 註冊】