Python Flask框架学习(二)

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"

pycharm如何更换国内镜像源

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个手刹不太灵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值