详见flask学习包:
后端代码:
from flask import Flask from flask import render_template from flask import request from flask import redirect from flask import session from flask import url_for app = Flask(__name__) # Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值 app.config['SECRET_KEY'] = '123456' app.Debug = True data = [ { 'name':'a1', 'old':22, 'gender':'男', }, { 'name':'a2', 'old':12, 'gender':'男' }, { 'name': 'a3', 'old': 22, 'gender': '女' }, ] @app.route('/',methods=['GET','POST'],endpoint='l1') def login(): if request.method == "GET": return render_template('login.html') elif request.method == "POST": # request.query_string 为存储头部数据 # request.form 中存储的是body数据 user = request.form.get('user') pwd = request.form.get('pwd') if user == 'root' and pwd == '123': session['user'] = user return redirect('/index') else: return render_template('login.html',error='用户名或密码错误!') @app.route('/index/',methods=['GET'],endpoint='zhuye') def index(): url = url_for('l1') if request.method == 'GET': user = session.get('user') if not user: return redirect(url) return render_template('index.html',u_list=data) @app.route("/detail/<int:id>",methods=['GET']) def detail(id): return str(id) if __name__ == '__main__': app.run()
前段代码:
index
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <table> {% for i in u_list %} <tr> <td>{{ i }}</td> <td>{{ i.old }}</td> <td>{{ i.get('gender') }}</td> <td>{{ i.get('gender') }}</td> <td><a href="/detail/{{ i.get('old') }}">查看详细</a></td> </tr> {% endfor %} </table> </body> </html>
login
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <h1> 登录 </h1> <form method="post"> <span>用户名 <input name="user" type="text"></span> <span>密码 <input name="pwd" type="pwd"></span> <input type="submit" value="提交">{{ error }} </form> <script src="/static/js/jquery-1.7.1.min.js"></script> <script> alter('OK') </script> </body> </html>
目录截图:
from flask import Flask from flask import render_template from flask import request from flask import redirect from flask import session from flask import url_for from functools import wraps app = Flask(__name__) #------------------------------------------------------------------------------- # flask 实现登录装饰器的功能 def login_required(func): @wraps(func) # @wraps(view_func)的作用: 不改变使用装饰器原有函数的结构(如__name__, __doc__) # 不使用wraps可能出现的ERROR: view_func...endpoint...map... def wrapper(*args,**kwargs): if session.get('user'): return func(*args,**kwargs) else: return redirect('/') return wrapper #------------------------------------------------------------------------------- # flask 配置文件介绍: # 方式一: # Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值 # app.config['SECRET_KEY'] = '123456' # app.config['DEBUG'] = True # 方式二:(只有部分可以如此操作) # app.secret_key = '123456' # 方式三:(导入配置文件的方式) # app.config.from_pyfile('setting.py') # 方式四:(推荐方式:在配置文件中写一个类,将配置写在类里面,再导入) app.config.from_object('setting.Text') # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 使用session 前 必须配置SECRET_KEY!!! # session 操作:(session就相当于是一个字典!) # session['类型'] = 值 # session.pop['类型'] # del session['类型'] # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 路由系统: # 基于装饰器来实现,但是究其本质是通过下面函数实现的 # app.add_url_rule(rule='/路径',endpoint='别名',view_func='视图函数',methods='访问的类型/["GET","POST"]') # CBV 的flask 方式: # from flask import views # 配置视图 # class Text(views.MethodView): # methods = ['GET','POST'] # # 登录装饰器 # # decorators = [login_required,] # # def get(self): # return 'Text_Class_get' # # def post(self): # return 'Text_Class,post' # # 配置路由 # app.add_url_rule(rule='/text/',view_func=Text.as_view(name='text')) # app.add_url_rule 和 app.route # 参数: # rule: url 规则 # view_func 视图函数名称 # defaults=None 默认值,当url中没有参数 # endpoint=None 反向生成url,不能重名,在使用装饰器时,没有导入@wraps(func)则需要区分 # methods=None 允许的请求方式,如:['GET','POST'] # strict_slashes=None 对URL最后的 / 符号是否严格要求 # redirect_to=None 重定向地址 # subdomain=None 子域名访问,需要配合域名使用 # 常用路由方式: # @app.route('/user/<username>') # @app.route('/user/<int:post_id>') # @app.route('/user/<float:post_id>') # @app.route('/user/<path:PATH>') # @app.route('/user/',methods=['GET','POST']) # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 模板:(模板也支持导入,继承) # 跟 django 都是使用的jinja2 模板 # 前段 安全渲染 {func | safe } # 后端 安全渲染 import Markup 函数 # # 新增功能 # {% macro 自定义函数名(参数,参数N) %} # <span>{{参数}}---{{参数n}}</span> # <span>{{参数}}---{{参数n}}</span> # <span>{{参数}}---{{参数n}}</span> # {% endmacro%} # # # 调用上面的函数 # {{自定义函数(参数)}} # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 请求和响应 # request # response # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 闪现 : 临时数据操作 如:显示错误信息 from flask import flash,get_flashed_messages @app.route('/get') def get(): data = get_flashed_messages() # data = get_flashed_messages(category_filter=['l1']) 分类取数据 print(data) return "get" @app.route('/set') def set(): flash('aaaaaa') # flash('aaaaaa',category='l1') #可以数据分类 return "set" # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 请求扩展 (django中的中间件) # @app.before_first_request # 函数 @app.before_request def preocess_request(*args,**kwargs): print(request.path) @app.after_request def preocess_response(response): return response # @app.after_request # 函数 # &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 传递数据至前段 data = [ { 'name':'a1', 'old':22, 'gender':'男', }, { 'name':'a2', 'old':12, 'gender':'男' }, { 'name': 'a3', 'old': 22, 'gender': '女' }, ] @app.route('/',methods=['GET','POST'],endpoint='l1') def login(): if request.method == "GET": return render_template('login.html') elif request.method == "POST": # request.query_string 为存储头部数据 # request.form 中存储的是body数据 user = request.form.get('user') pwd = request.form.get('pwd') if user == 'root' and pwd == '123': session['user'] = user return redirect('/index') else: return render_template('login.html',error='用户名或密码错误!') # 不是装饰器 实现的方式: # @app.route('/index/',methods=['GET'],endpoint='zhuye') # def index(): # url = url_for('l1') # if request.method == 'GET': # user = session.get('user') # if not user: # return redirect(url) # return render_template('index.html',u_list=data) # 装饰器实现的方式: @app.route('/index/',methods=['GET']) @login_required # flask 登录装饰器 def index(): return render_template('index.html',u_list=data) @app.route("/detail/<int:id>",methods=['GET']) def detail(id): return str(id) if __name__ == '__main__': app.run()