中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Python基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄注冊(cè)】

實(shí)現(xiàn)目標(biāo)

基于Flask實(shí)現(xiàn)用戶(hù)的登錄/注冊(cè)。

設(shè)計(jì)思路

  • 前端
    1.編寫(xiě)登錄和注冊(cè)表單
    2.編寫(xiě)視圖函數(shù)
    3.編寫(xiě)相應(yīng)的html文件
    4.頁(yè)面測(cè)試
  • 后臺(tái)
    1.創(chuàng)建數(shù)據(jù)庫(kù)
    2.修改配置文件
    3.編寫(xiě)數(shù)據(jù)表類(lèi)并生成數(shù)據(jù)表
    4.修改視圖函數(shù),實(shí)現(xiàn)數(shù)據(jù)交互

前端實(shí)現(xiàn)

1.編寫(xiě)登錄和注冊(cè)表單(/app/home/forms.py)
# 導(dǎo)入表單基類(lèi)
from flask_wtf import FlaskForm
# 導(dǎo)入需要用到的表格類(lèi)型
from wtforms import StringField, PasswordField, SubmitField
# 導(dǎo)入需要用的驗(yàn)證方式
from wtforms.validators import DataRequired, EqualTo, Length, Email

# 用戶(hù)注冊(cè)表單
class RegisterForm(FlaskForm):
    # 用戶(hù)名表框
    username = StringField(
        label= '用戶(hù)名',    # 標(biāo)簽
        validators=[        # 驗(yàn)證方式
            DataRequired()  # 不能為空
        ]
    )
    # 密碼表框
    password = PasswordField(
        label='密碼',
        validators=[
            DataRequired(),
            Length(6,16,message='密碼長(zhǎng)度應(yīng)在6-16位') # 密碼長(zhǎng)度必須在6-16,否則輸出提示信息
        ]
    )
    # 郵箱表框
    email = StringField(
        label='郵箱',
        validators=[
            DataRequired(),
            Email(message='郵箱不合法')
        ]
    )
    # 注冊(cè)按鈕
    submit = SubmitField(
        label='注冊(cè)'
    )

# 登錄表單
class LoginForm(FlaskForm):
    username = StringField(
        label='用戶(hù)名',
        validators=[
            DataRequired()
        ]
    )

    password = PasswordField(
        label='密碼',
        validators=[
            Length(6, 16, message='密碼長(zhǎng)度應(yīng)在6-16位')
        ]
    )

    submit = SubmitField(
        label='登錄'
    )

2.編寫(xiě)視圖函數(shù)(/app/home/views.py)
from . import home_bp # 導(dǎo)入藍(lán)圖
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.編寫(xiě)相應(yīng)的html文件
  • 基模板(/app/templates/base.html)
    為了統(tǒng)一頁(yè)面風(fēng)格,繼承bootstrap/base.html,創(chuàng)建自己的基模板

    創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序定制開(kāi)發(fā)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等多方位專(zhuān)業(yè)化運(yùn)作于一體。

  • 登錄頁(yè)面(/app/templates/login.html)
    登錄頁(yè)面,繼承自上面的base.html,并在content中生成登錄表單

  • 注冊(cè)頁(yè)面(/app/templates/register.html)
    注冊(cè)頁(yè)面,繼承自上面的base.html,并在content中生成注冊(cè)表單

4.測(cè)試效果

Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】
Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】


后臺(tái)實(shí)現(xiàn)

1.創(chuàng)建數(shù)據(jù)庫(kù)
    在MySQL shell中創(chuàng)建數(shù)據(jù)庫(kù)

Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】


2.修改配置文件
    在配置文件中添加代碼如下:
# 數(shù)據(jù)庫(kù)配置
SQLALCHEMY_DATABASE_URI ="mysql://root:mysql@locallost/sentry" # 指定數(shù)據(jù)庫(kù)
SQLALCHEMY_TRACK_MODIFICATIONS = False # 關(guān)閉追蹤

3.編寫(xiě)數(shù)據(jù)表類(lèi)并生成數(shù)據(jù)表
    在models.py中編寫(xiě)數(shù)據(jù)表結(jié)構(gòu)如下:
from app import db

# 用戶(hù)數(shù)據(jù)表
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實(shí)例化數(shù)據(jù)庫(kù)對(duì)象
from flask_sqlalchemy import SQLAlchemy
import pymysql

# 數(shù)據(jù)庫(kù)報(bào)錯(cuò)問(wèn)題
pymysql.install_as_MySQLdb()
# 讀取配置文件的配置信息
app.config.from_pyfile('../config.py')
db = SQLAlchemy(app)
    在manage.py中添加代碼如下:
from app import db # 導(dǎo)入數(shù)據(jù)庫(kù)對(duì)象
from werkzeug.security import generate_password_hash  # 哈希加密
from app.models import User # 導(dǎo)入數(shù)據(jù)表類(lèi)

@manager.command  # 使函數(shù)可以作為命令在shell中直接執(zhí)行
def db_init():
    db.drop_all() # 刪除已有數(shù)據(jù)表
    db.create_all() # 創(chuàng)建新數(shù)據(jù)表
    admin = User(name='admin', password=generate_password_hash('admin')) # 實(shí)例化一個(gè)用戶(hù)對(duì)象
    db.session.add(admin) # 添加入session
    db.session.commit() # 提交給數(shù)據(jù)庫(kù)
    print("數(shù)據(jù)庫(kù)初始化成功")
    在python shell 中執(zhí)行 python manage.py db_init 即可完成數(shù)據(jù)庫(kù)初始化
    在mysql中查看

Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】


4.修改視圖函數(shù),實(shí)現(xiàn)數(shù)據(jù)交互
from werkzeug.security import generate_password_hash # 哈希加密

from app import db
from . import home_bp # 導(dǎo)入藍(lán)圖
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():
        # 獲取表單中的數(shù)據(jù)
        username = form.username.data
        password = form.password.data
        # 在數(shù)據(jù)庫(kù)中查找
        user = User.query.filter_by(name = username).first()
        # 用戶(hù)名和密碼匹配成功時(shí)
        if user and user.verify_password(password):
            # 登陸成功將用戶(hù)信息添加到session信息中去
            session['user']=user.name
            session['id']= user.id
            flash('登錄成功')
            return redirect(url_for('home.index'))
        flash('用戶(hù)名或密碼錯(cuò)誤')

    return render_template('login.html',form=form)

# 注冊(cè)
@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():
        # 獲取表單中的數(shù)據(jù)
        name = form.username.data
        password = form.password.data
        email = form.email.data
        if User.query.filter_by(name=name).first():
            flash('用戶(hù)名已存在')
            return redirect(url_for('home.register'))
        if User.query.filter_by(email=email).first():
            flash('郵箱已占用')
            return redirect(url_for('home.register'))
        # 密碼進(jìn)行哈希加密
        user = User(name=name,password=generate_password_hash(password),email=email)
        db.session.add(user)
        db.session.commit()
        flash('注冊(cè)成功,請(qǐng)登錄')
        return redirect(url_for('home.login'))
    return render_template('register.html',form=form)

# 注銷(xiāo)
@home_bp.route('/logout/')
def logout():
        # 清除session信息
    session.clear()
    return redirect(url_for('home.login'))

部分測(cè)試結(jié)果

Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】
Python 基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄 注冊(cè)】

新聞名稱(chēng):Python基于Flask的Web開(kāi)發(fā)【1】【用戶(hù)登錄注冊(cè)】
轉(zhuǎn)載源于:http://www.rwnh.cn/article10/jdcido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、建站公司、商城網(wǎng)站搜索引擎優(yōu)化、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
上犹县| 巴彦淖尔市| 瓦房店市| 德安县| 永仁县| 常山县| 商丘市| 六安市| 武宁县| 梁平县| 连南| 青岛市| 全南县| 江津市| 福泉市| 镇原县| 鄂托克前旗| 灌阳县| 兴安县| 宜宾市| 荔浦县| 双江| 屏山县| 札达县| 彝良县| 凤山市| 胶南市| 林周县| 铁岭市| 上思县| 娱乐| 建宁县| 闽侯县| 剑阁县| 贺兰县| 乌拉特前旗| 金门县| 兰西县| 兰坪| 内丘县| 霞浦县|