1. 程式人生 > >Flask實現登入功能【附完整Demo】

Flask實現登入功能【附完整Demo】

網站少不了要和資料庫打交道,歸根到底都是一些增刪改查操作,這裡做一個簡單的使用者登入功能來學習一下Flask如何操作MySQL。

用到的一些知識點:Flask-SQLAlchemy、Flask-Login、Flask-WTF、PyMySQL

這裡通過一個完整的登入例項來介紹,程式已經成功執行,在未登入時攔截了success.html頁面跳轉到登入頁面,登入成功後才能訪問success。

以下是專案的整體結構圖:

首先是配置資訊,配置了資料庫連線等基本的資訊,config.py

DEBUG = True
SQLALCHEMY_ECHO = False
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]/rl_project?charset=utf8'
SECRET_KEY = '*\xff\x93\xc8w\x13\
[email protected]
\xd6\x82\x0f\x84\x18\xe7\xd9\\|\x04e\xb9(\xfd\xc3'

common/_init_.py

# config=utf-8
from flask_sqlalchemy import SQLAlchemy

__all__ = ['db']
db = SQLAlchemy()

資料庫配置類,common/data.py

# config=utf-8
from sqlalchemy import create_engine
from sqlalchemy.sql import text
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_ECHO


def db_query(sql, settings=None, echo=None):

    if settings is None:
        settings = SQLALCHEMY_DATABASE_URI

    if echo is None:
        echo = SQLALCHEMY_ECHO

    return create_engine(settings, echo=echo).connect().execute(text(sql)).fetchall()


def db_execute(sql, settings=None, echo=None):

    if settings is None:
        settings = SQLALCHEMY_DATABASE_URI

    if echo is None:
        echo = SQLALCHEMY_ECHO

    return create_engine(settings, echo=echo).connect().execute(text(sql)).rowcount
SQLALCHEMY_DATABASE_URI用於連線資料的資料庫。
SQLALCHEMY_ECHO如果設定成 True,SQLAlchemy 將會記錄所有 發到標準輸出(stderr)的語句,這對除錯很有幫助。
當然,我們在setting中設定了基本的連線資料庫資訊,啟動時載入app = create_app('../config.py'),所以這個類刪掉也不會報錯。

form/login_form.py
# config=utf-8
from flask_wtf import FlaskForm as Form
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired


class LoginForm(Form):
    accountNumber = StringField('accountNumber', validators=[DataRequired('accountNumber is null')])
    password = PasswordField('password', validators=[DataRequired('password is null')])
使用Flask-WTF做登入的表單驗證,這裡簡單做了賬號密碼不為空如,當我們不填寫密碼時,點選登入:
model/_init_.py
# config=utf-8
from flask import Flask
from flask_login import LoginManager
from common import db

login_manager = LoginManager()
login_manager.login_view = "user.login"


def create_app(config_filename=None):
    app = Flask(__name__)
    login_manager.init_app(app)

    if config_filename is not None:
        app.config.from_pyfile(config_filename)
        configure_database(app)

    return app


def configure_database(app):
    db.init_app(app)
其中,login_manager.login_view = "user.login" 指定了未登入時跳轉的頁面,即被攔截後統一跳到user/login這個路由下model/user_model.py
# config=utf-8
from flask_login import UserMixin
from common import db


class User(db.Model, UserMixin):

    user_id = db.Column('id', db.Integer, primary_key=True)
    accountNumber = db.Column(db.String(200), unique=True)
    password = db.Column(db.String(50), unique=True)
    name = db.Column(db.String(20), unique=True)

    __tablename__ = 'tb_user'

    def __init__(self, user_id=None, account_number=None, password=None, name="anonymous"):

        self.user_id = user_id
        self.accountNumber = account_number
        self.password = password
        self.name = name

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return unicode(self.user_id)

    def __repr__(self):
        return '<User %r>' % (self.accountNumber)
get_id()返回一個能唯一識別使用者的,並能用於從 user_loader 回撥中 載入使用者的 unicode 。注意著 必須 是一個 unicode ——如果 ID 原本是 一個 int 或其它型別,你需要把它轉換為 unicode 。is_authenticated()當用戶通過驗證時,也即提供有效證明時返回 Trueis_active()如果這是一個通過驗證、已啟用、未被停用的賬戶返回 True 。is_anonymous()如果是一個匿名使用者,返回 True 。login.py
#encoding:utf-8
#!/usr/bin/env python
from flask import render_template, request, redirect, Flask, Blueprint
from flask_login import login_user, login_required
from model.user_model import User
from model import login_manager
from form.login_form import LoginForm


userRoute = Blueprint('user', __name__, url_prefix='/user', template_folder='templates', static_folder='static')

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


@userRoute.before_request
def before_request():
    pass

@userRoute.route('/success')
@login_required
def index():
    return render_template('success.html')

@userRoute.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if request.method == 'POST':
        if not form.validate_on_submit():
            print form.errors
            return render_template('login.html', form=form)

        user = User.query.filter(User.accountNumber == form.accountNumber.data,
                                 User.password == form.password.data).first()
        if user:
            login_user(user)
            return render_template('success.html')

    return render_template('login.html', form=form)
其中,要實現一個load_user()回撥方法,這個回撥用於從會話中儲存的使用者 ID 重新載入使用者物件,id存在則返回對應的使用者物件,不存在則返回none。有些操作是需要使用者登入的,有些操作則無需使用者登入,這裡使用到了@login_required,在每一個需要登入才能訪問的路由方法上加@login_required即可。啟動類,runserver.py
# config=utf-8
from login import userRoute
from model import create_app

DEFAULT_MODULES = [userRoute]

app = create_app('../config.py')

for module in DEFAULT_MODULES:
    app.register_blueprint(module)


@app.before_request
def before_request():
    pass


if __name__ == '__main__':
    app.run(debug=True)
DEFAULT_MODULES = [userRoute]是將userRoute藍圖註冊入app,才能啟動login中的userRoute路由,我們在login.py中使用了藍圖:userRoute = Blueprint('user', __name__, url_prefix='/user', template_folder='templates', static_folder='static')
@app.before_request
def before_request():
    pass
這是一個全域性的方法,在請求開始之前被呼叫,在某些場景下做一些提示或者特殊處理,當然這裡沒用上,直接pass,這個方法去掉對專案沒有影響。基本樣式模版,base.html
<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
    <script src="{{ url_for('static', filename='jquery1.42.min.js') }}"></script>
    {% block head %}{% endblock %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

登入前臺頁面,login.html

{% extends "base.html" %}
{% block title %}python flask user page{% endblock %}
{% block head %}
    <style type="text/css"></style>
{% endblock %}
{% block content %}
    <form action="{{ url_for('user.login') }}" method="post">
        {% if form.errors %}
            <ul>
                {% for name, errors in form.errors.items() %}
                    {% for error in errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                {% endfor %}
            </ul>
        {% endif %}
        賬號:{{ form.accountNumber(size=20) }}<label>{{ form.accountNumber.errors[0] }}</label><br/>
        密碼:<input name="password" type="password"/><br/>
        {{ form.hidden_tag() }}
        <button type="submit">登入</button>
    </form>
{% endblock %}

到此,一個Flask實現簡單登入功能就做完了。參照上面的介紹一步一步完全可以實現,如果想直接拿來用,Demo已上傳碼雲,地址:https://gitee.com/amuxia/py_study/tree/master/login_demo01

相關推薦

Flask實現登入功能完整Demo

網站少不了要和資料庫打交道,歸根到底都是一些增刪改查操作,這裡做一個簡單的使用者登入功能來學習一下Flask如何操作MySQL。用到的一些知識點:Flask-SQLAlchemy、Flask-Login、Flask-WTF、PyMySQL這裡通過一個完整的登入例項來介紹,程式

收藏機器學習的Pytorch實現資源集合下載連結

該專案用pytorch實現了從最基本的機器學習演算法:迴歸、聚類,到深度學習、強化學習等。該專案

react-native 完整實現登入功能

react native實現登入功能,包括ui的封裝、網路請求的封裝、導航器的實現、點選事件。 後臺如果是springmvc實現的需要配置上如下程式碼 <!--加入multipart 的解析器,這個必須配置,一會在controller裡抓取上傳

React Native呼叫Android原生程式碼實現車牌識別功能效果圖原始碼

        這段時間研究了下React Native,Facebook推出的,結合了Web應用和Native應用的優勢,可以使用JavaScript來開發iOS和Android原生應用,決定簡單研究下,於是開始搭建環境,編寫HelloWorld,完成後又覺得HelloWo

Android實現登入功能,Android與伺服器資料互動,使用tomcat、mysql實現登入demo程式,web端和android均可實現登入

1.使用到的開發工具為:Eclipse(Java EE),Android Studio,MYSQL 5.7.21;2.首先在MYSQL資料庫建表,我這裡使用的資料庫視覺化操作軟體為:navicat premium:如圖:這裡你可以取自己喜歡的資料庫名字,但是為了方便起見,我建

PHP實現RSA簽名生成訂單功能支付寶示例

score www. 密鑰 base var var_dump 完成 ada 轉義 //組合簽名 $a=time(); $b=substr($a, 1); //生成隨機訂單號 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以20

struts2實現登入功能

工程結構 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www

javaEE之jsp+JavaBean實現登入功能

javaEE之jsp+JavaBean實現登入功能(不加資料庫) 實現效果 JavaBean檔案: #UserBean.java package nmx; public class UserBean { private String username; p

jsp、jQuery、servlet互動實現登入功能

jsp、jQuery、servlet互動實現登入功能 做一個web專案,往往需要有一個登入模組,驗證使用者名稱和密碼之後跳轉頁面。為了實現更好的互動,往往需要用到 jQuery 等實現一些友好提示。比如使用者名稱或者密碼輸入為空的時候提示不能為空;點選提交的時候如果使用者名稱和密碼不正確,還需要

Django-Web框架之實現登入功能

我們開啟../sign/templates/index.html檔案,實現一個登入功能。新增如下程式碼: <!DOCTYPE html> <html> <head> <title>Django Page</title> <

MyBatis備忘:查詢資料庫實現登入功能的一個演示

複習:entity  DAO/DBHelper  service  action  jsp 總結:使用mybatis後的區別:DBHelper裡書寫的是SqlSession,而不是自己來拿資料庫連線了,當然這得寫配置檔案SqlMapConfig;serv

C++易於實現的有趣專案附上完整教程

簡述 喜歡一個女孩,昨天告白被拒了。 但是之前答應過她,這個學期她要學的CPP課程最後有一個課程專案,我會幫她。 現在的話,以她的個性,估計也不會主動找我問了。所以,才有了這個欄目。希望她在搜尋到的時

djago實現登入功能

######實現登入功能###### #templates下新增登入html模板,form表單中記得新增method和action #表單中對應input新增name #url中進行配置 url(r'^login$',views.LoginView.as_view()

REST風格框架實戰:從MVC到前後端分離(完整Demo)

摘要:   本人在前輩《從MVC到前後端分離(REST-個人也認為是目前比較流行和比較好的方式)》一文的基礎上,實現了一個基於Spring的符合REST風格的完整Demo,具有MVC分層結構並實現前後端分離,該專案體現了一個具有REST風格專案的基本特徵,即具有統一響應結構、 前後臺數據流轉機制(HTTP

玩轉Android Camera開發 五 基於Google自帶演算法實時檢測人臉並繪製人臉框 網路首發 完整demo

                    本文主要介紹使用Google自帶的FaceDetectionListener進行人臉檢測,並將檢測到的人臉用矩形框繪製出來。本文程式碼基於PlayCameraV1.0.0,在Camera的open和preview流程上進行了改動。原先是放在單獨執行緒裡,這次我又把它放到

用MVP框架網路獲取資料實現登入功能

<?xml version="1.0" encoding="utf-8"?> xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" an

web前端練習1----實現登入功能

效果圖: 思路: 1html+css 完成基本佈局 2Ajax請求資料完成登入功能 3把登入成功後的 token和使用者名稱傳到下個頁面 程式碼:我把所有程式碼:html css js 都寫在了一個檔案裡 Login.html <!DOCTYPE htm

python_Django 實現登入功能form表單的引數接收處理

1.建立Django工程。 參考https://www.cnblogs.com/CK85/p/10159159.html中步驟。 2.在urls.py檔案中新增url分發路徑 """Django_test URL Configuration The `urlpatterns` list rout

jxl實現excel匯入匯出的完整demo

@RequestMapping("/pointsImport.do") public void StructureImport(HttpServletRequest request, HttpServletResponse response, Long driv

java實現登入功能

package test1; import java.util.Scanner; public class Login {      public static void main(String[] args) {       //3 登入系統,提示輸入使用者名稱和密碼,設