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 本身相当于一个内核,其他几乎所有的功能都 ...
 
随机推荐
- iOS10修改电池状态栏的方法
 - FIR滤波器的FPGA实现方法
			
FIR滤波器的FPGA实现方法 2011-02-21 23:34:15 来源:互联网 非常重要的基本单元.近年来,由于FPGA具有高速度.高集成度和高可靠性的特点而得到快速发展.随着现代数字 ...
 - 洛谷P1979 华容道
			
神の契约 题目大意:自己看去... 题解:做了一下午...本蒟蒻立志要写全网最详细的题解.╭(╯^╰)╮ begin.... 暴力70分.可以让空格子到处乱走,只要某个状态的指定格子到目标格子,那么此 ...
 - django的manytomany总结
			
from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagli ...
 - Nginx 反向代理与负载均衡详解
			
序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在Nginx 配置详解中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Ngin ...
 - C++的引用类型【转载】
			
c++比起c来除了多了类类型外还多出一种类型:引用.这个东西变量不象变量,指针不象指针,我以前对它不太懂,看程序时碰到引用都稀里糊涂蒙过去.最近把引用好好地揣摩了一番,小有收获,特公之于社区,让初学者 ...
 - tomcat部署war包启动后请求无响应,一直报404
			
刚刚碰到一个坑,本地Eclipse启动了tomcat,调用接口就是404,一直怀疑是url问题,改来改去还是404.最后发现还真是url问题,问题不在接口路径,而是项目名.因为接口路径用的是RESTf ...
 - 通过docker构建zabbix监控系统
			
下载zabbix的镜像 $ docker pull berngp/docker-zabbix Using default tag: latest latest: Pulling from berngp ...
 - 1、python基础速成
			
基础模块 def prt(age,name):#函数定义 print("%s is %d 年龄 old"%(name,age)) if __name__=="__main ...
 - netty中的websocket
			
使用WebSocket 协议来实现一个基于浏览器的聊天室应用程序,图12-1 说明了该应用程序的逻辑: (1)客户端发送一个消息:(2)该消息将被广播到所有其他连接的客户端. WebSocket 在从 ...