Flask框架 之 学生管理分析
先看模板吧。
index.html
<body>
<h1>学生列表</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>选项</th>
</tr>
</thead>
<tbody>
{% for k,v in stu_dic.items() %}
<tr>
<td>{{k}}</td>
<td>{{v.name }}</td>
<td>{{v.age}}</td>
<td>{{v.gender}}</td>
<td>
<a href="/detail/{{k}}">查看详细</a>
|
<a href="/delete/{{k}}">删除</a> </td>
</tr>
{% endfor %}
</tbody>
</table>
detail.html
<body>
<h1>学生详细</h1>
<ul> {% for item in info.values() %}
<li>{{item}}</li>
{% endfor %}
</ul>
</body>
app.py
from flask import Flask,render_template,request,redirect,session,url_for,jsonify,make_response,Markup,flash,get_flashed_messages
app = Flask(__name__)
STUDENT_DICT = {
1:{'name':'王龙泰','age':38,'gender':'中'},
2:{'name':'小东北','age':73,'gender':'男'},
3:{'name':'田硕','age':84,'gender':'男'},
}
我们如何对这些数据进行操作呢?
@app.route('/index')
def index():
print('index')
return render_template('index.html',stu_dic=STUDENT_DICT)
@app.route('/delete/<int:nid>') #指定为Int,否则为str
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index'))
@app.route('/detail/<int:nid>')
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html',info=info)
后台管理是随便可以看的吗?是不是应该先登录后进行操作呢?
@app.route('/login',methods=["GET","POST"])
def login():
print('login')
if request.method == 'GET':
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'oldboy' and pwd == '666':
session['user'] = user #存入session
return redirect('/index')
return render_template('login.html',error='用户名或密码错误')
不要忘了存入session需要加盐。app.secret_key="xxxxx"
然后呢?
从session中取到随机字符串,判断是否登录。每个操作都要校验,每个函数都要加(以index为例)。
版本一:
@app.route('/index')
def index():
if not session.get('user'):
return redirect(url_for('login'))
return render_template('index.html',stu_dic=STUDENT_DICT)
每个函数都要加,是不是太麻烦了。我们可以写个装饰器。
版本二:
#装饰器
def auth(func): def inner(*args,**kwargs):
if not session.get('user'):
return redirect(url_for('login'))
ret = func(*args,**kwargs)
return ret
return inner @app.route('/index')
@auth
def index():
return render_template('index.html',stu_dic=STUDENT_DICT)
结果你发现会报错。

这是因为每个函数执行装饰器,函数名都会变为inner,重名出错不是很正常吗?关键是我们如何解决?
这里就用到了functools模块。

这个模块加入装饰器,我们执行函数时,虽然看似是inner,但本质是各函数名。
这样就解决了这个问题。可是如果用到装饰器的地方少,可以这样写,如果多呢?我们总不能还是每个函数都加。
装饰器应用场景:比较少的函数中需要额外添加功能。
注意:以后写装饰器时,都要记得使用functools模块。
版本三:
我们需要写一个函数,这个函数执行代表所有的操作,下面的操作就可以简单明了。
before_request装饰的这个函数,在我们的视图函数执行之前,无论哪个请求,都会先执行一下。就跟django中间件中的process_request有点像。每个请求进来都要经过它。
所以在要操作的函数之前再写一个函数。
@app.before_request
def xxxxxx():
if request.path == '/login':
return None #可以通过 if session.get('user'):
return None #已登录,可以通过 return redirect('/login') #否则,回到登录页面
这种方法使用于批量添加操作时。
Flask框架 之 学生管理分析的更多相关文章
- 基于flask框架的高校舆情分析系统
系统分析: 高校舆情分析拟实现如下功能,采集微博.贴吧.学校官网的舆情信息,对这些舆情进行数据分析.情感分析,提取关键词,生成词云分析,情感分析图,实时监测舆情动态. 系统设计: 前端:采用layui ...
- Flask框架 之 上下文管理前戏
偏函数 自动传递参数 import functools def index(a1,a2): return a1 + a2 # 原来的调用方式 # ret = index(1,23) # print(r ...
- Python-S9-Day116——Flask框架相关
01 内容回顾 02 Flask框架:路由和视图(一) 03 Flask框架:路由和视图(二) 04 Flask框架:路由和视图(三) 05 Flask框架:路由和视图(四) 06 Flask框架:s ...
- Flask框架(三)—— 请求扩展、中间件、蓝图、session源码分析
Flask框架(三)—— 请求扩展.中间件.蓝图.session源码分析 目录 请求扩展.中间件.蓝图.session源码分析 一.请求扩展 1.before_request 2.after_requ ...
- Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...
- Flask框架(五) —— session源码分析
Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...
- 基于SSH框架的学生选课质量属性分析
系统:学生选课系统 框架:SSH(Struts2+Spring+Hibernate) 我做的是基于SSH框架的学生选课系统.学生选课系统的特性:①系统响应时间短,能够快速调出课程数据供学生选课提交.② ...
- Flask上下文管理源码分析
上下文管理本质(类似于threading.local): 1.每一个线程都会在Local类中创建一条数据: { "唯一标识":{stark:[ctx,]}, "唯一标识& ...
- Flask框架入门(一)
Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎所有的功能都 ...
随机推荐
- avalon 总线时序关系理解
对于读,等待时间指的是从端口捕获数据的时间相对于read信号的延时 建立时间指的是read信号相对于chipselect和addr的延时时间 对于写,等待时间指的是相对于非等待情况下各个信号的延时时间 ...
- 转载 matlab矩阵数组常用操作
一. length 返回矩阵最长维的的长度 ndims 返回维数 numel 返回矩阵元素个数size ...
- 转载关于reset vector 和 exception vector
在NIOS II学习过程中设置CPU参数的时候,遇到Reset Vector和Exception Vector的设置.参数设置画面如下图所示. Reset Vector——复位向量Exception ...
- 【精品分享二】ASP.NET MVC系列精品图书高清PDF下载
更多图书请关注:第一教育云电子书平台 http://book.1eduyun.com/ 注:本专题提供的所有的电子书下载资源均系收集于百度云,本网站(http://book.1eduyun.com/ ...
- winSCP连接FTP没有上传的权限
错误: 原因: ftp用户为 1)查看ubantu中FTP文件夹目录所有者及权限,发现ftpName用户对FTP文件夹的权限为 “r-x” ,仅有读,执行权限 2) chmod o=rwx ftp ...
- erlang的dict和maps模块
erlang在r17以后增加了map这个数据结构,在之前,类似map的需求用dict模块来实现,这里直接贴一下相关的操作 dict D = dict:new(). D1 = dict:store(k1 ...
- mysql权限验证流程
mysql用户管理,逐级下查 mysql库的user表连接信息,全局权限db表记录用户对库的权限,对某个数据库的所有表的权限tables_priv 设置用户对表的权限columns_priv设置用户对 ...
- Kaggle 比赛项目总结(项目流程)
一.EDA(Exploratory Data Analysis) EDA:也就是探索性的分析数据 目的: 理解每个特征的意义: 知道哪些特征是有用的,这些特征哪些是直接可以用的,哪些需要经过变换才能用 ...
- java流类,快速统计出字符次数+++
总结:学会给一个合适的命名,不要总是abc..虽然简单,但是不容易看懂,和方便去理解 package com.aini; import java.io.File; import java.io.Fil ...
- android欢迎页
在进入程序后,会在一个页面停留几秒然后自动跳转到程序主界面,这个页面就是欢迎页. 首先新建个java文件,给他起名叫做WelcomeActivity 在里面我们通过一个匿名类new Handler,在 ...