flask获取参数
request对象:请求里的所有东西都在request对象里,比如说你请求的url、参数、cookies
request.path 获取请求资源的路径 --str类型
request.args 获取url里的参数 --dict类型
request.form 获取body里面携带的表单数据 --dict类型
request.json 获取传递过来的json格式数据,并转化为对象
request.method 获取请求的方法
request.url 获取请求过来的url
1、get 通过url传递参数
安装postman
from flask import Blueprint, request
# 请求里的所有东西都在request对象里面,
# 定义了一个login的url
@study_bp.route("/login")
def login():
print(request.path) # /study/login
# 通过url参数传递
username = request.args["username"]
passwd = request.args["passwd"]
return f"username is {username},passwd is {passwd}"
url传参,参数用=接收,参数之间用&连接
请求的过程中http有请求主题信息body,前面封装头部字段(包含url)
methods
增:post(填写表单数据,没写前端可以用postman模拟)
删:delete
改:put
查:get,浏览器不允许有body,但是postman可以有
2、post通过表单传递参数
@study_bp.route("/login")
# @study_bp.route("/login",methods=["POST"]) 界面上就要用POST方法请求,否则报405方法错误
def login():
username = request.form["username"]
passwd = request.form["passwd"]
return f"username is {username},passwd is {passwd}"
3、通过json获取参数
@study_bp.route("/login",methods=["POST"])
def login():
username = request.json["user"]
passwd = request.json["passwd"]
return f"username is {username},passwd is {passwd}"
4、通过动态url来获取参数
@study_bp.route("/register/<username>/<passwd>", methods=["PUT", "GET"])
def register(username, passwd):
return f"username is {username},passwd is {passwd}"
flask获取页面
{{ }} jinja2的语法
url_for 反向解析出url路径。根据endpoint找到url
static endpoint
/static/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>flask test</title>
</head>
<body>
<h1>这是flask测试</h1>
<p>{{content}}</p> <!--模板文件,渲染、动态生成文件-->
<p><img src="{{url_for('static',filename='1.jpg')}}"></p>
</body>
</html>
/router/study.py
from flask import Blueprint, request
from flask import render_template
# 创建了蓝图
study_bp = Blueprint("study", __name__, url_prefix="/study")
@study_bp.route("/img")
def img():
content = "hejinsdgffkerhpgieurhoerhgpirhgpis"
return render_template("index.html", width="400px", height="300px", content=content)
/router/_init_.py 在初始化文件时候要把蓝图注册到app上
# 导入包的时候自动执行
from .study import study_bp
from .bbs import bbs_bp
# 不能直接导入,因为当前路径的top_level是config平级的 导入的时候会从这个top_level开始找study
def init_app(app):
# 把蓝图注册到app上
app.register_blueprint(study_bp)
app.register_blueprint(bbs_bp)
flask和数据库交互
新建model模块 放数据库相关的数据;
orm对数据库进行操作(flask——orm对象——mysql)
ORM:object relational mapping(对象关系映射)
flask不需要何复杂的sql语句打交道,只需要操控orm对象。orm就是用来将数据库里的表结构映射成模型类。
类产生的对象,就是对
虚拟环境中先安装flask_sqlalchemy
PS E:\桌面\cjh-flask> pip -V
pip 21.2.4 from E:\桌面\myenv\lib\site-packages\pip (python 3.9)
PS E:\桌面\cjh-flask> pip install flask_sqlalchemy
pip install flask_sqlalchemy
临时更换豆瓣源
pip install flask_sqlalchemy -i http://pypi.douban.com/simple/ --trusted-host
pypi.douban.com
pip install flask_sqlalchemy -i "https://pypi.doubanio.com/simple"
config/settings.py
# 设置主机监听地址信息
DEBUG = True
HOST = "192.168.2.111"
PORT = 8000
# 用户名:密码@数据库主机/数据库
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Sanchaung123#@192.168.169.137/hj?charset=utf8"
SQLALCHEMY_TRACK_MODIFICATIONS = True
model/User.py
对象关系映射
from model import db
from sqlalchemy import Column, Integer, String
class User(db.Model):
__tablename__ = "user"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), nullable=False)
age = Column(Integer)
增加用户
@user_bp.route("/add", methods=["POST"])
def add_user():
username = request.json["username"]
userage = request.json["userage"]
user = User()
user.name = username
user.age = userage
db.session.add(user)
db.session.commit()
return "添加用户成功"
删除用户
@user_bp.route("/delete/<id>", methods=["DELETE"])
def delete_user(id):
# 删除
# 使用get查找,只针对主键
user = User.query.get(id)
db.session.delete(user)
db.session.commit()
return "删除用户成功"
修改用户
@user_bp.route("/update", methods=["PUT"])
def change_user():
id = request.args["id"]
user = User.query.get(id)
username = request.json["username"]
userage = request.json["userage"]
user.name = username
user.age = userage
db.session.add(user)
db.session.commit()
return "修改用户成功"
查询用户
@user_bp.route("/get")
def get_user():
# 拿到多条记录,存放在一个列表里面
# 列表里面存放了多个对象
user = User.query.all()
# return user # 列表里面包对象
# return dict(user) # 列表转字典
tmp_dict = {}
tmp_list = []
for u in user:
tmp_dict["username"] = u.name
tmp_dict["userage"] = u.age
tmp_list.append(tmp_dict)
return json.dumps(tmp_list)
return user
TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a list.
return dict(user)
TypeError: cannot convert dictionary update sequence element #0 to a sequence
flask整体流程
客户端发起请求,服务器收到请求,解析http包头信息,拿到body, 头部信息包含(url、请求方法等信息),body(包含了json格式的数据)。
通过url和请求方法来判断处理:通过url来在url_map表里找到对应的endpoint,通过endpoint在view_function里面找到对应的视图函数。
判断请求方法是否正确,正确就调用相应的函数做视图处理。
可以通过request对象
如果有数据库的操作,就导入相应的模型类,这里通过操控ORM对象来操控来操控数据库,实现数据的增删改查。
对于查询操作,数据库的对象不能直接返回,需要对他进行序列化,做对应的格式转换,建议使用json,最后返回api数据。
在定义类的时候
def to_json(self):
return {
"id": self.id,
"name": self.name,
"age": self.age
}
统一返回标准化
作业:
restful编程风格
表示层状态转移
api设计风格,把每一个资源
pip install flask_restful
查询小结
多条件查询
https://www.zhihu.com/people/zhi-yao-87-40/posts