项目结构
app.py
# coding=utf-8
from flask import Flask, request, render_template, session, redirect
from routes.user import user
from routes.table import table
from routes.login import login
from routes.wx import wx
from routes.system.region_setting import region_setting
import redis
from flask_session import Session
from datetime import timedelta
app = Flask(__name__)
app.secret_key = 'wkuss'
app.config['JSON_AS_ASCII'] = False
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(seconds=1)
app.config['SESSION_TYPE'] = 'redis' # session类型为redis
app.config['SESSION_PERMANENT'] = True # 如果设置为True,则关闭浏览器session就失效。
app.config['SESSION_USE_SIGNER'] = True # 是否对发送到浏览器上session的cookie值进行加密
app.config['SESSION_KEY_PREFIX'] = 'py_sess:' # 保存到session中的值的前缀
pool = redis.ConnectionPool(host='localhost', port=6379, db=10)
app.config['SESSION_REDIS'] = redis.Redis(connection_pool=pool) # 用于连接redis的配置
Session(app)
# 可对实例、配置模板文件路径、静态文路径进行配置
Flask(__name__, static_folder='static', static_url_path='', template_folder='templates')
# 静态文件目录的路径 默认当前项目中的static目录
static_folder = 'static'
# 静态文件目录的url路径 默认不写是与static_folder同名,远程静态文件时复用
static_url_path = None,
# template模板目录, 默认当前项目中的 templates 目录
template_folder = 'templates'
# 配置不需要认证的路由
passUrl = ['/login', '/static', '/wx']
# 使用app.before_request路由过滤,类似java中的添加filter里面的处理
@app.before_request
def before_request():
path = request.path
next = isStaticOrLogin = False
# 不需要认证的路径,登录界面,静态资源等
for url in passUrl:
if url in path and path.index(url) == 0:
isStaticOrLogin = True
break
if not isStaticOrLogin:
# 不是静态资源,判断是否有session
if 'user' in session:
next = True
if not isStaticOrLogin:
# 不是静态资源,并且next为false,说明没有登录状态,重定向到登录界面
if not next:
return redirect('/login/index')
@app.route('/main', methods=['GET'])
def main():
user = session['user']
return render_template('main.html', user=user)
@app.route('/index', methods=['GET'])
def index():
return render_template('index.html')
app.register_blueprint(user, url_prefix='/user')
app.register_blueprint(table, url_prefix='/table')
app.register_blueprint(login, url_prefix='/login')
app.register_blueprint(wx, url_prefix='/wx')
app.register_blueprint(region_setting, url_prefix='/region_setting')
if __name__ == '__main__':
app.run(port=9000)
login下__init__.py示例
login = Blueprint(‘login’, __name__)这句是app.py中引入这个login路由的关键
# coding=utf-8
from flask import request, render_template, Blueprint, session, redirect
# from config.mongo import mg
from config.db import db
from datetime import timedelta
import json
login = Blueprint('login', __name__)
@login.route('/index')
def index():
try:
region = db.select('select * from sys_region')
data = []
for r in region:
print(r)
obj = {
"id": r["ID_KEY"],
"name": r["CD_NM"],
"fullname": r["fullname"],
"pid": r["PARENT_ID"],
"order_id": r["ORDER_CD"],
"last_mark": r["LAST_MARK"],
"remark": "",
"isuse": 1
}
data.append(obj)
# mg.insert_many(data, 'sys_region')
except Exception as e:
print(e)
return render_template('login.html')
@login.route('/submit', methods=['POST'])
def submit():
form = request.form.to_dict()
loginname, loginpass = form.get('loginname'), form.get('loginpass')
user = db.select("select * from plat_user where loginname='%s' and loginpass='%s'" % (loginname, loginpass))
# user, total = mg.find_page(1, 1, {"loginname": loginname, "loginpass": loginpass}, 'user', None)
if len(user) > 0 and user[0] is not None:
user = user[0]
print(user)
if user['isUsed'] == 0:
return {"status": 500, "msg": "该用户已被禁用"}
session['user'] = user
session.permanent = True
# 配置session过期时间
login.permanent_session_lifetime = timedelta(hours=10)
return {"status": 200, "success": '/main'}
else:
return {"status": 500, "msg": "用户名或密码错误"}
@login.route('/out', methods=['POST', 'GET'])
def out():
if 'user' in session:
session.clear()
if request.method == 'POST':
return {"status": 200, "out": "/login/index"}
else:
redirect('/login/index')
login.html
在这里又了解到了创建文章时候’__'下划线的使用了,要加\这个斜杠才会显示,我佛了