url-统一资源定位符-不同的url对应不同的资源
 作为服务端,url和视图函数的映射关系就是路由。
定义传递参数的方式:
 1.创建动态url
@app.route("/login2/<username>/<passwd>")
def login2(username, passwd):
    if username == "root" and passwd == "123456":
       return f"login success"
    else:
        return f"login false"
 
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)
 

 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)
 
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"
 
html语言一定是要有响应的,所以不要忘记"return html",不然会报500状态🐎的错误。
发送的请求:可以有url携带参数(http头部)+body一种方式(data部分)。
浏览器默认GET方法,是不允许body数据传递,而是一Headers传递(全在url上)
    print(request.url) #整个路径
    print(request.path) #资源路径
    print(request.headers) #头部字段
 

 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)
 
拆分
入口文件:
 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'])
 
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
 
./config/settings.py
DEBUG = 'True'
HOST = "0.0.0.0"
PORT = 9000
 
蓝图
 就像一个中间层,方便管理路由
 app – bp – 视图
视图先绑bp,bp再去绑定app
 .route/__init__.py
from .view01 import view01_bp
def init_app(app):
    app.register_blueprint(view01_bp)
 
.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"
 
app.py
 在crete_app()中添加
    import router
    router.init_app(sq_app) #将蓝图与app绑定
 
综合:登录注册(拆分+蓝图)

 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'])
 
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
 
config.settings.py
DEBUG = 'True'
HOST = "0.0.0.0"
PORT = 9000
# 全局变量
user_dict = {}
 
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)
 
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"
 
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!"
 
用postman的GET方法+json数据格式按要求测试。










