• 【自学开发之旅】Flask-回顾--对象拆分-蓝图(二)


    url-统一资源定位符-不同的url对应不同的资源
    作为服务端,url和视图函数的映射关系就是路由。

    定义传递参数的方式:
    1.创建动态url

    @app.route("/login2//")
    def login2(username, passwd):
        if username == "root" and passwd == "123456":
           return f"login success"
        else:
            return f"login false"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.url携带参数:? &

    记住传过来的东西都在我们flask的request对象,这个对象不需要我们管,flask框架已经给我们搞好了,需要什么,就用request的属性拿就好了

    理解:接口 and API(登录为例)
    接口:一般来说,是两个程序使用的,互相通信,A程序暴露一个接口,B程序调用即可。后端flask写好了接口,前端一般不涉及数据库,不能判断能否登陆成功(nodejs也可以虽做后端,只是不普遍),所以前程调用后端的接口(login接口),把账号密码参数传递过来,然后后端再去数据库里判断是否正确,再去做一步操作,并返回给前端登录是否成功。

    接口文档:
    url+请求方法+传递参数+返回结果

    3.json 接收传递过来的json格式数据

    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route("/login")
    def login():
        print(request.json.get("username"))
        print(request.json.get("password"))
        return "login html"
    
    app.run(debug=True, host="0.0.0.0", port=9000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    postman一功能:怎么写程序发起这种请求
    在这里插入图片描述

    import requests
    import json
    
    url = "http://127.0.0.1:9000/login"
    
    #字典-》json格式字符串
    payload = json.dumps({
      "username": "root",
      "password": "123456"
    })
    headers = {
      'Content-Type': 'application/json'
    }
    
    response = requests.request("GET", url, headers=headers, data=payload)
    
    print(response.text)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.form表单传递数据

    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route("/login")
    def login():
    	print(request.form.get("username"))
        print(request.form.get("password")
        return "login html"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    html语言一定是要有响应的,所以不要忘记"return html",不然会报500状态🐎的错误。

    发送的请求:可以有url携带参数(http头部)+body一种方式(data部分)。

    浏览器默认GET方法,是不允许body数据传递,而是一Headers传递(全在url上)

        print(request.url) #整个路径
        print(request.path) #资源路径
        print(request.headers) #头部字段
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    5.小练习:登录注册功能

    """
    @date: 2023/9/5
    @file: 登录注册功能
    @author: Jiangda
    @desc: test
    
    """
    
    from flask import Flask, request
    app = Flask(__name__)
    
    user_dict = {}
    @app.route("/register")
    def register():
        username = request.json.get("username")
        passwd = request.json.get("passwd")
        re_passwd = request.json.get("re_passwd")
        if not (username and passwd and re_passwd):
            return "参数传递不完整"
        elif passwd != re_passwd:
            return "注册密码不一致"
        elif username in user_dict:
            return "用户已注册"
        else:
            user_dict[username] = passwd
            print(f"user_dict is {user_dict}")
            return "register success!"
    
    
    app.run(debug=True, host="0.0.0.0", port=9000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    拆分

    入口文件:
    server.py
    排查问题两大思路:1.新增文件有没有运行。2.有没有绑定到核心对象app上

    from app import create_app
    sq_app = create_app()
    sq_app.run(host = sq_app.config['HOST'],
               port = sq_app.config['PORT'],
               debug = sq_app.config['DEBUG'])
    
    • 1
    • 2
    • 3
    • 4
    • 5

    app.py
    核心对象的设置和创建,每一个核心对象是一个网站,可以运行很多核心对象

    import os
    from flask import Flask
    
    
    def create_app():
        sq_app = Flask(__name__)
    
        # 方式一:从配置文件中读取
        #    if isinstance(obj, str):
        #        obj = import_string(obj)
        #    for key in dir(obj):
        #        if key.isupper():
        #            self[key] = getattr(obj, key)
        sq_app.config.from_object('config.settings')
    
        # 方式二:从环境变量中读取(好处:根据不同的系统环境加载不同的配置文件)
        if 'FLASK_CONF' in os.environ:
            sq_app.config.from_envvar('FLASK_CONF')
    
        return sq_app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    ./config/settings.py

    DEBUG = 'True'
    HOST = "0.0.0.0"
    PORT = 9000
    
    • 1
    • 2
    • 3

    蓝图
    就像一个中间层,方便管理路由
    app – bp – 视图

    视图先绑bp,bp再去绑定app
    .route/__init__.py

    from .view01 import view01_bp
    
    def init_app(app):
        app.register_blueprint(view01_bp)
    
    • 1
    • 2
    • 3
    • 4

    .route/view01.py

    # 管理视图
    from flask import Blueprint
    
    view01_bp = Blueprint("view01", __name__, url_prefix="/v1/")
    
    @view01_bp.route("index")
    def index():
        return "this is index"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    app.py
    在crete_app()中添加

        import router
        router.init_app(sq_app) #将蓝图与app绑定
    
    • 1
    • 2

    综合:登录注册(拆分+蓝图)

    在这里插入图片描述
    server.py

    from app import create_app
    sq_app = create_app()
    sq_app.run(host = sq_app.config['HOST'],
               port = sq_app.config['PORT'],
               debug = sq_app.config['DEBUG'])
    
    • 1
    • 2
    • 3
    • 4
    • 5

    app.py

    import os
    from flask import Flask
    
    
    def create_app():
        sq_app = Flask(__name__)
    
        # 方式一:从配置文件中读取
        sq_app.config.from_object('config.settings')
    
        # 方式二:从环境变量中读取(好处:根据不同的系统环境加载不同的配置文件)
        if 'FLASK_CONF' in os.environ:
            sq_app.config.from_envvar('FLASK_CONF')
    
    
        import router
        router.init_app(sq_app) #将蓝图与app绑定
    
        return sq_app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    config.settings.py

    DEBUG = 'True'
    HOST = "0.0.0.0"
    PORT = 9000
    
    # 全局变量
    user_dict = {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    router/…
    __init__.py

    from .login import login_bp
    from .register import register_bp
    
    def init_app(app):
        app.register_blueprint(login_bp)
        app.register_blueprint(register_bp)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    login.py

    from flask import Blueprint, request
    from config.settings import user_dict
    
    login_bp = Blueprint("login_bp", __name__, url_prefix="/v1")
    
    @login_bp.route("login")
    def login():
        user = request.json.get("username")
        passwd = request.json.get("passwd")
        local_user_passwd = user_dict.get(user)
        if local_user_passwd and passwd == local_user_passwd:
            return "login success!"
        return "login fail"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    register.py

    from flask import Blueprint, request
    from config.settings import user_dict
    
    register_bp = Blueprint("register_bp", __name__, url_prefix="/v1")
    
    @register_bp.route("register")
    def register():
        username = request.json.get("username")
        passwd = request.json.get("passwd")
        re_passwd = request.json.get("re_passwd")
        if not (username and passwd and re_passwd):
            return "参数传递不完整"
        elif passwd != re_passwd:
            return "注册密码不一致"
        elif username in user_dict:
            return "用户已注册"
        else:
            user_dict[username] = passwd
            print(f"user_dict is {user_dict}")
            return "register success!"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    用postman的GET方法+json数据格式按要求测试。

  • 相关阅读:
    linux系统常用命令
    践行绿色发展理念,产业园区绿色转型发展之五大路径
    uniapp微信小程序_自定义交费逻辑编写
    RPA技术介绍与应用价值
    asp.net core mvc之 布局
    HTML5 新增表单标签
    2022年跨境电商卖家如何在Facebook上做广告【完整指南】
    CloudCompare 二次开发(9)——半径滤波
    Python【字符串】【列表】【元组】常用操作
    C++多态详解
  • 原文地址:https://blog.csdn.net/Stephen_Daa/article/details/132640953