Flask框架:
python三大框架优缺点
Flask:
优点: 小而精,短小精悍,第三方组件特别多
缺点: 组件更新速度取决于开源者
Tornado:
优点: 原生的WebSocket, 异步任务, IO非阻塞玩
缺点: 没有组件,Session都没有
Django:
优点: 大而全,组件非常全面
缺点: 太大,重量级框架,加载太大,浪费资源
Flask的优势:
Flask的优势
Flask中的Werkzuge原理,__call__()
Flask的第一个Hello OldBoyEDU
Flask的 HTTPresponse render_template redirect
Flask中的 request
Flask中的 Jinja2 ,Markup
Flask中的 session secret_key
Flask中的路由系统 url_for
Werkzuge:
from werkzeug.wrappers import Response, Request from werkzeug.serving import run_simple # application源码里面 get_wsgi_headers 里面有个__call__方法 # 可以调用__call__ 在执行flk的时候执行call里面的结果 @Request.application def flk(r): print(r.url) if r.url == ‘/123‘: asd() return Response("hello") # flk run_simple("127.0.0.1", 5500, flk) def asd(): print(‘kermit‘) asd()
Flask三剑客:
HTTPresponse: return "Hello OldBoyEDU"
render_template: return render_template("login.html") #templates
redirect: return redirect("/login")
# Httpresponse @apl.route("/index") def index(): return "Hello OldBoyEDU" # render_template @apl.route("/login") def login(): return render_template("login.html") # redirect @apl.route("/") def root_path(): return redirect("/login")
Flask需要自己开启:(必走流程)
from flask import Flask, render_template, redirect apl = Flask(__name__) apl.run() # 可以自定义ip 端口 和debug模式
Request:
request.method 获取请求方式
request.form 获取FromData数据(通常情况下的POST请求)
request.args 获取GET方式提交的数据
request.files 获取file
request.url_about 获取所有的关于URL的参数
request.values 获取全部提交方式
to_dict 坑,覆盖,GET覆盖POST
request.headers 获取头部信息
request.cookie 获取客户端cookie
request.json 数据头:application/json
request.data 在没有任何数据头的情况提交的POST
模板语言:
Flask 基于 Jinja2 做了一层小小小小小小的封装
向前端传递数据 render_template 参数传递 stu = {k1:v1}
{{ stu }} <td>{{ stu.name }}</td> <td>{{ stu["age"] }}</td> {% if stu.get("gender") == "中" %} <td>男</td> {% else %} <td>{{ stu.get("gender") }}</td> {% endif %} STUDENT_LIST = [ {‘name‘: ‘Old‘, ‘age‘: 38, ‘gender‘: ‘中‘}, {‘name‘: ‘Boy‘, ‘age‘: 73, ‘gender‘: ‘男‘}, {‘name‘: ‘EDU‘, ‘age‘: 84, ‘gender‘: ‘女‘} ] <td>{{ stu.0.name }}</td> <td>{{ stu[0]["age"] }}</td> {% if stu[0].get("gender") == "中" %} <td>男</td> {% else %} <td>{{ stu.0.get("gender") }}</td> {% endif %} @apl.template_global() def a_b_sum(a,b): return a+b {{ a_b_sum(123,234) }} @apl.template_filter() def a_b_c_sum(a,b,c): return a+b+c {{ 123 | a_b_c_sum(1,2) }}
安全字符串:Markup 相当于 模板里面有 safe
{{ input | safe }} Markup() : Markup("<input type=‘text‘ name=‘input_tag‘>")
为了让pycharm识别模板语言的格式:设置jinja2的语言
Session:secret_key="" 这个是开启session必备的参数
form flask import session app.secret_key = "随意" session["user"] = "xxxx" if session.get("user")
Flask 路由 :
flk.route()
"/index" 路由地址
"/index/<nid>" 动态路由地址(视图函数需要nid参数)
"/index/<int:nid>" 动态路由地址
methods=["GET","POST"] 允许URL的请求方式
endpoint="index" 反向URL操作,可以解决Inner重名的问题
redirect_to="/index2" 服务器端页面跳转 301永久性重定向
strict_slashes=False 可以使用"/"结尾 反之不可以
defaults={"nid":1} 视图函数默认参数
所以例子:
from flask import Flask, Markup, render_template, redirect, request, session, url_for flk = Flask(__name__) flk.secret_key = "Dragon" # 开启session必备的参数 STUDENT = {‘name‘: ‘Old‘, ‘age‘: 38, ‘gender‘: ‘中‘} STUDENT_LIST = [ {‘name‘: ‘Old‘, ‘age‘: 38, ‘gender‘: ‘中‘}, {‘name‘: ‘Boy‘, ‘age‘: 73, ‘gender‘: ‘男‘}, {‘name‘: ‘EDU‘, ‘age‘: 84, ‘gender‘: ‘女‘} ] STUDENT_DICT = { 1: {‘name‘: ‘Old‘, ‘age‘: 38, ‘gender‘: ‘中‘}, 2: {‘name‘: ‘Boy‘, ‘age‘: 73, ‘gender‘: ‘男‘}, 3: {‘name‘: ‘EDU‘, ‘age‘: 84, ‘gender‘: ‘女‘}, } # 用template_global 可以直接在模板调用这个函数作为参数 # {{ a_b_sum(11,22) }} 33 @flk.template_global() def a_b_sum(a, b): return a + b # template_filter 可以直接在模板调用这个函数作为参数 + | 前面的数字 # {{ 22 | a_b_c_sum(11,22) }} 55 也就是参数a是22 @flk.template_filter() def a_b_c_sum(a, b, c): return a + b + c # 装饰器 def wra(func): print(‘外部‘) def inner(*args, **kwargs): print(‘内部‘) if session.get(‘user‘): return func(*args, **kwargs) return redirect(‘/login‘) return inner # 添加 endpoint 参数 是为了如果所有视图都用同一个装饰器会走inner函数, # 然后会重名,为了给它设置不同的名称 @flk.route("/index/<string:nid>", endpoint="index1") @wra # inner = wra(index) def index(nid): # url_for是访问的url相对路径 参数与route的url得一直 print("nid", url_for("index1", nid=nid)) # Markup就是在后端写前端页面并且加了safe input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>") return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag) @flk.route("/index2", endpoint="index2") @wra # inner = wra(index) def index2(): # Markup就是在后端写前端页面并且加了safe input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>") return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag) @flk.route("/index3", endpoint="index3") @wra # inner = wra(index) def index3(): # Markup就是在后端写前端页面并且加了safe input_tag = Markup("<input type=‘text‘ name=‘input_tag‘>") return render_template("index.html", stus=STUDENT_LIST, input_tag=input_tag) @flk.route(‘/login‘, methods=[‘GET‘, ‘POST‘]) def login(): if request.method == ‘GET‘: return render_template(‘login.html‘) else: # login.html指定了multipart/form-data,所以可以通过request.form来获取 username = request.form[‘user‘] password = request.form[‘pwd‘] if username == ‘kermit‘ and password == ‘123‘: session[‘user‘] = username return redirect(‘/index‘) if username == ‘egon‘ and password == ‘123‘: session[‘user‘] = username return redirect(‘/index‘) return render_template(‘login.html‘, msg="用户名密码错误!!!") if __name__ == ‘__main__‘: flk.run(debug=True)
原文地址:https://www.cnblogs.com/kermitjam/p/9508827.html