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"
                )
posted @ 2020-06-07 17:39  Hedger_Lee  阅读(46)  评论(0编辑  收藏  举报