Flask
Flask
安装和创建Flask
pip install Flask
创建使用代码,三行代码启动Flask项目
from flask import Flask
app = Flask(__name__)
'''...视图函数
@app.route("/")
def index():
pass
'''
if __name__ == '__main__':
app.run()
# app.run("0.0.0.0",9527) # 监听地址 监听端口
Flask中的Response
from flask import Flask, render_template, redirect, send_file
1.字符串return ""
2.模板return render_template(html文件)
3.重定向return redirect('/')
视图函数的url
4.文件return send_file()
返回文件内容,自动识别文件类型
文件类型:Content-type中添加文件类型
浏览器的特性:浏览器会自动识别文件类型,
可识别的文件类型,自动渲染,
不可识别的Content-type会自动下载
5.json格式字符串return jsonfy()
返回标准格式的JSON字符串,先序列化JSON的字典,Content-type中加入 Application/json,
Flask 1.1.1 版本中 可以直接返回字典格式,无需jsonify
@app.route("/")
def home():
return "hello World I am Flask"
# return None
@app.route("/index")
def index():
return render_template("index.html")
@app.route("/login")
def login():
return redirect("/index")
@app.route("/get_file")
def get_file():
return send_file("2.exe") # 返回文件内容,自动识别文件类型,Content-type中添加文件类型,Content-type:文件类型
@app.route("/get_json")
def get_json():
d = {"k":"v"}
return d
# return jsonify(d) # 返回标准Json格式字符串 API接口
Flask中的Request
request.method 获取请求方式
request.form 获取FormData中的数据 也就是所谓的Form标签 to_dict()
request.args 获取URL中的数据 to_dict()
request.json 请求中 Content-Type:application/json 请求体中的数据 被序列化到 request.json 中 以字典的形式存放
request.data 请求中 Content-Type 中不包含 Form 或 FormData 保留请求体中的原始数据 b""
request.files 获取Form中的文件
request.path 请求路径 路由地址
request.url 访问请求的完整路径包括url参数
request.host 主机位 127.0.0.1:5000
request.cookies 字典获取浏览器请求时带上的Cookie
request.values 获取 url 和 FormData 中的数据(不常用)
@app.route("/login",methods=["GET","POST"])
def login():
# print(request.args.to_dict())
# print(request.host)
# print(request.path)
# print(request.url)
# print(request.cookies)
# 优先判断 请求方式
# 如果是 GET 请求 返回登录页面
if request.method == "GET":
return render_template("login.html")
# 如果是 POST 请求 获取用户名密码 校验
else: # 405 请求方式不被允许
my_file = request.files.get("my_file")
filename = my_file.filename # 获取原始文件名
file_path = os.path.join("avatar",filename)
my_file.save(file_path)
print(request.form.to_dict()) # form - FormData
if request.form.get("username") == "YWB":
return "Login OK!"
return "Login 不OK!"
Flask中的session
要设置一个secret_key
from falsk import Flask, session
app = Flask(__name__)
app.secret_key = "#$%&*"
# 使用session
session["user"] = "123"
session使用示例
# !/usr/bin/env python
# -*- coding:utf-8 -*-
STUDENT_DICT = {
1: {'name': 'Old', 'age': 38, 'gender': '中'},
2: {'name': 'Boy', 'age': 73, 'gender': '男'},
3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}
from flask import Flask, render_template, request, redirect, session
app = Flask(__name__)
app.debug = True
app.secret_key = 'dt'
@app.route("/login", methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
user_info = request.form.to_dict()
# print(user_info)
user = user_info.get('user')
pwd = user_info.get('pwd')
if user == 'alex' and pwd == '123':
session['is_login'] = user + pwd
return redirect('/stu_profile')
else:
return '用户名或密码错误'
@app.route("/stu_profile")
def stu_profile():
# if session.get('is_login'):
return render_template('stu_profile.html', stu=STUDENT_DICT)
if __name__ == '__main__':
app.run()
Flask中的路由
@app.route()
# 参数:
rule "/login" 路由地址
methods 允许进入视图函数的请求方式
endpoint Mapping 路由地址和endpoint - 路由地址和视图函数
Mapping endpoint在同一个app中不能出现重复,默认值是视图函数名
defaults 默认路由参数
strict_slashes 是否严格遵循路由匹配规则
redirect_to 永久重定向 308 301
动态参数路由 `"/get_muisc/<filename>"`
def get_muisc(filename) 可以分页,获取文件,解决分类,解决正则路由问题
Flask初始化配置
app = Flask(__name__,template_folder="templatess")
template_folder="templatess" 模板文件存放路径
static_folder 静态文件存放目录 默认值 是 static
static_url_path 静态文件访问路径 默认值 是 / + static_folder
Flask实例配置 -> app的配置
可以给不同的环境设置不同的配置,使用哪个环境的时候导入即可
app.config.from_object(TestConfig)
class TestConfig(object):
TESTING = True
SECRET_KEY = hashlib.md5(f"{time.time()}#$%^&*($#$%^&*%$#$%^&*^%$#$%{time.time()}".encode("utf8")).hexdigest()
PERMANENT_SESSION_LIFETIME = 360000
SESSION_COOKIE_NAME = "#$%^&*($#$%^&*%$#$%^&*^%$#$%"
app.config.from_object(TestConfig)
Flask中的蓝图Blueprint (app)
不能被run的Flask实例,不存在Config,主要是为了隔离app,功能隔离
from flask import Blueprint
bp = Blueprint("app01",__name__)
@bp.route("/add_user")
def add_user():
return "添加用户"
@bp.route("/find_user")
def find_user():
return "查看用户"
@bp.route("/drop_user")
def drop_user():
return "删除用户"
@bp.route("/up_user")
def up_user():
return "修改用户"
from flask import Blueprint
car_bp = Blueprint("app02",__name__,url_prefix="/car")
@car_bp.route("/add_user")
def add_user():
return "car添加用户"
@car_bp.route("/find_user")
def find_user():
return "car查看用户"
@car_bp.route("/drop_user")
def drop_user():
return "car删除用户"
@car_bp.route("/up_user")
def up_user():
print("I am vf")
return "car修改用户"
蓝图写好导入主文件,app注册蓝图,即可访问蓝图中路由url
app.register_blueprint(bp)
app.register_blueprint(car_bp)
Flask中的特殊装饰器
@app.before_request
在请求进入视图函数之前 做出处理
@app.after_request
在响应返回客户端之前,结束视图函数之后
@app.errorhandler(404)
对某种错误类型进行监控
@app.before_request
def be1():
print("I am Be1")
# return "第一个请求你就过不去" # 5种
@app.before_request
def be2():
print("I am Be2")
# return "第二个请求过不去了" # 5种
@app.after_request
def af1(res):
print("I am af1")
return res
@app.after_request
def af2(res):
print("I am af2")
return res
@app.errorhandler(404)
def error404(error_message):
print(error_message)
return "你的页面被哥斯拉吃了"
Flask中CBV-RestAPI
使用CBV,先编写视图类
from flask import views
class Login(views.MethodView):
def get(*args,**kwargs):
pass
app.add_url_rule("url",endpoint=None,view_func=Login.as_view(name="当前视图函数名,必须唯一,因为他是endpoint"))
CBV简单示例
class Login(views.MethodView): # 继承 MethodView 让我当前的 class 可以成为视图类
# methods = ["POST"]
# decorators = [is_login]
def get(self,*args,**kwargs):
return "I am Get"
def post(self,*args,**kwargs):
pass
# def dragonfire(self,*args,**kwargs):
# pass
view_func = Login.as_view(name="loginlogin")
# view_func.__name__ = "loginlogin"
app.add_url_rule("/login",
# endpoint="my_login",
view_func=view_func # view_func.__name__ = "loginlogin"
)