Flask實現登入功能【附完整Demo】
用到的一些知識點: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
SQLALCHEMY_DATABASE_URI用於連線資料的資料庫。# 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_ECHO如果設定成 True,SQLAlchemy 將會記錄所有 發到標準輸出(stderr)的語句,這對除錯很有幫助。
當然,我們在setting中設定了基本的連線資料庫資訊,啟動時載入app = create_app('../config.py'),所以這個類刪掉也不會報錯。
form/login_form.py
使用Flask-WTF做登入的表單驗證,這裡簡單做了賬號密碼不為空如,當我們不填寫密碼時,點選登入:# 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')])
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 登入系統,提示輸入使用者名稱和密碼,設