Flask框架基本使用

Flask框架基本使用

1.环境准备

pip install flask
  • Flask Flask库文件
    • Jinja2 模板渲染库
    • MarkupSafe 返回安全标签 只要Flask 返回模板或者标签时都会依赖MarkupSafe
    • Werkzeug 德文“工具” == uWSGI 底层是 WSGI Flask项目启动都是基于Werkzeug

2.应用Flask

2.1 启动服务

from flask import Flask

app=Flask(__name__)

app.run()

image-20211217170508145

2.2 返回字符串

# -*- coding: utf-8 -*-
'''
@Time    : 2021/12/17 16:49
@Author  : ziqingbaojian
@File    : app.py
'''
from flask import Flask

app=Flask(__name__)

@app.route('/index')
def index():
    return 'Hello world'

if __name__ == '__main__':
    app.run()

image-20211217170603203

3.Response

3.1 返回值

Flask Django

  1. HTTPResponse("HelloWorld") "HelloWorld"

  2. render("html文件") render_template("HTML文件") # 默认存放路径是"templates"

  3. redirect("/home") redirect("/home")

  • from flask import Flask
    from flask import redirect,render_template
    
    app=Flask(__name__)
    
    @app.route('/index')
    def index():
        return render_template("index.html")#返回HTML界面
    
    @app.route('/home')
    def home():
        return redirect("/index")#使用重定向;
    
    if __name__ == '__main__':
        app.run()
    
  • image-20211217171301826

  • image-20211217171614584

3.2 特殊返回值

3.1 返回文件

  • send_file("文件路径") 返回文件

  • from flask import Flask, send_file
    from flask import redirect,render_template
    
    @app.route("/getfile")
    def getfile():
        return send_file('./1.jpg')
    
    if __name__ == '__main__':
        app.run()
    https://typora-imgs-1308859190.cos.ap-beijing.myqcloud.com/giteeimg/image-20211217172743449.png
    

image-20211217173344645

  • send_file返回的文件如果无法被客户端识别(浏览器)识别,浏览器就会将该文件进行下载处理。
打开并返回文件内容 自动识别文件类型 在ResponseHeaders中加入
Content-Type:文件类型 - *文件类型 是可以被客户端识别的文件类型
不能识别的类型 下载处理 - 浏览器会下载
  • x-ms x二进制 ms微软 wma文件
    • 本质上是修改了Conntent-Type中的值属性;

3.2 jsonfiy

  • jsonify("字符串或数据类型") 返回标准格式的JSON字符串

  • 可以直接返回字典,但是不建议使用,没有良好的兼容性;直接返回dict时 本质上在执行jsonify(d)

  • **本质*:编写ResponseHeaders 加入 Content-Type:application/json

  • API 接口 AJAX.post({username:123}){function(data){ obj = data }}

  • 打包JSON 序列化JSON字符串

  • from flask import Flask, send_file
    from flask import redirect,render_template
    from flask import jsonify
    
    @app.route("/getjson")
    def get_json():
        dic={
            "user":"章北海",
            "age":20,
            "msg":"Hello World"
    }
        return jsonify(dic)
    if __name__ == '__main__':
        app.run()
    
    
  • image-20211217175054432

3.3 开启debug模式

  • 使用debug默认重启项目

  • image-20211217173947211

  • 方式一
  • from flask import Flask, send_file
    from flask import redirect,render_template
    app=Flask(__name__)
    app.debug=True #此处设置debug
    @app.route('/index') 
    def index():
        return render_template("index.html")
    
    if __name__ == '__main__':
        app.run()
    
    
  • 方式二
  • from flask import Flask, send_file
    from flask import redirect,render_template
    app=Flask(__name__)
    #app.debug=True #此处设置debug
    @app.route('/index') 
    def index():
        return render_template("index.html")
    
    if __name__ == '__main__':
        app.run(debug=True)
    
  • 方式三
    • 此方式,注意Debug必须要大写哦
  • from flask import Flask, send_file
    from flask import redirect,render_template
    app=Flask(__name__)
    app.config.update(DEBUG=True)
    @app.route('/index') 
    def index():
        return render_template("index.html")
    
    if __name__ == '__main__':
        app.run()
    
    

4.Request

  • methods=["GET","POST"] 在添加路由的装饰器中允许请求方式,覆盖
    1.request.form 获取FormData中的数据 to_dict() ,返回ImmutableMultiDict
    2.request.method 获取请求方式
    3.request.args # 获取URL中的数据 字符串 get("key") to_dict()

  • 1.Request 导入 - 请求上下文 
    2.Request.method 请求方式 HTTP 8 种 POST DELETE PUT GET OPTIONS请求跨域
    3.Request.path url_root 路由地址
    4.Request.host 获取访问主机地址
    # 方法:
    request.form	# FormData中的数据 to_dict() 直接返回字典数据
    request.args	# URL中的数据
    request.data	请求体的原始信息 只有在 Content-Type 没有 Form b""
    request.json	请求头中的 Content-Type:application/json 字典
    request.headers	请求头中的信息
    request.cookies	请求中Cookie的信息
    # 坑:
    	request.values	不可触及的地带
    
  • 登录界面示例

  • @app.route('/login',methods=['GET','POST'])
    def login():
        if request.method=='GET':
            return render_template('login.html')
        # data=request.form#ImmutableMultiDict([('username', 'df'), ('username', 'fds')])
        # print(data)
        user=request.form.get("user")
        pwd=request.form.get("pwd")
        if user=='123' and pwd=='123':
            return "登录成功"
        # 模板渲染是**{}
        return render_template('login.html',**{"error":"用户名或密码错误"})
    
  • image-20220108143757765

  • image-20220108144126439

5.session

  • 基本使用

交由客户端保管机制
	1.开启Session - session["user"] = 123
	2.session 序列化字符串
	3.通过 secret_key 进行加密
	4.通过 Cookie 返回客户端
接收Session
    1.通过 Cookie 获取 session
    2.通过 secret_key 解密
    3.反序列化 字典
from flask import Flask,session #手动导入

app=Flask(__name__)
app.secret_key="apsiddy@#$%6*(#@!!Dd"
#secret_key手动设置。

@app.route('/login',endpoint='login')
def login():
    session["user"]="user on login"
    return "login request"

@app.route('/index',endpoint='index')
def index():
    a=session.get("user")
    print(a)
    return "index"

if __name__ == '__main__':
    app.run()

说明:endpoint='index'相当于django中的 URL 后name的别名。应该保证唯一性。

image-20220403081719199

image-20220403081745148

6.加载配置文件

导入配置文件的源码:

def from_object(self, obj: t.Union[object, str]) -> None:
    if isinstance(obj, str):
        obj = import_string(obj)
    for key in dir(obj):# 使用反射创建对象
        if key.isupper():
            self[key] = getattr(obj, key)
def import_string(import_name: str, silent: bool = False) -> t.Any:
    import_name = import_name.replace(":", ".")
    try:
        try:
            __import__(import_name)
        except ImportError:
            if "." not in import_name:
                raise
        else:
            return sys.modules[import_name]

        module_name, obj_name = import_name.rsplit(".",1)#按照点分割字符串为两段
        module = __import__(module_name, globals(), locals(), [obj_name])
        try:
            return getattr(module, obj_name)
        except AttributeError as e:
            raise ImportError(e) from None

    except ImportError as e:
        if not silent:
            raise ImportStringError(import_name, e).with_traceback(
                sys.exc_info()[2]
            ) from None

    return None

6.1 全局变量型

说明:与django的相同

settings.py

XX=123
DEBUG=True

try:
	from .local_settings import *
except ImportError:
    pass

local_settings.py

# 配置一些私密的配置和本地的配置
SECRET_KEY="apsiddy@#$%6*(#@!!Dd"

# 本地数据库连接,密码

'''
本文件上传的时候不进行上传,使用`.gitignore`进行忽略
'''
from flask import Flask,session

app=Flask(__name__)
# app.secret_key="apsiddy@#$%6*(#@!!Dd"
# 加载配置文件
app.config.from_object('config.settings')
print(app.config['XX'])

6.2 类的配置文件

settings.py

class BaseSettings(object):
    X=123
    # 将两种环境中所共有的特征进行抽取

class DevSettings(BaseSettings):
    HOST='127.0.0.1'


class PordSettings(BaseSettings):
    HOST='1.1.1.2'


7.视图

7.1 FBV

@app.route('/index',endpoint='index')
def index():
    a=session.get("user")
    print(a)
    return "index"

if __name__ == '__main__':
    app.run()

7.2 CBV

from flask import Flask,views



app = Flask(__name__,)


def outer(func):
    def inener(*args,**kwargs):
        print("before")
        res =inener()
        print("after")
        return res

class UserView(views.MethodView):
    methods = ['GET']
    decorators = [outer,]
    def get(self):
        return "GET"

    def post(self):
        return 'OK'


# app.add_url_rule('/user',view_func=UserView.as_view(name='user'))# as_view的参数即为 endpoint
app.add_url_rule('/user',view_func=UserView.as_view())


if __name__ == '__main__':
    app.run()
posted @ 2022-07-12 22:51  紫青宝剑  阅读(294)  评论(0编辑  收藏  举报