Bootstrap

Flask07_get请求

# encoding=utf-8
"""
1、基于HTTP协议,请求有很多类型
    GET 明文,添加在url上,用来获取服务器资源的请求,编写方便,但是不安全
    HEAD 和GET方法相同,以未加密的形式将数据发送到服务器,但没有响应体
    POST 加密请求,请求数据请求过程当中不可见,通常用来向服务器提交数据
    PUT 类POST请求,通常用来全文修改数据,用上传的内容替换目标资源
    DELETE 类POST请求,用来删除数据,没有返回值,删除由URL给出的目标资源
    OPTION 类POST请求,通常用来局部修改数据
2、HTTP状态码:对请求结果反馈的约定
    200 请求成功
    300 页面跳转
    400 请求失败,请求端问题
    500 请求失败,服务器错误
3、request对象:获取原始请求信息数据对象
(1)request存在
    A、Django视图函数都有一个叫做request的参数,用来接收请求
    B、Flask视图函数不携带request请求,而是用request模块来代替
(2)Flask请求处理
    A、Flask由全局的对象来处理请求,叫request
    B、需要导入request:from flask import request
(3)request方法(常用)
    A、request.args:获取get请求的参数,类型为MultiDict
    B、request.form:获取post请求参数,类型为MultiDict
    C、request.data:原始的请求数据,以字符串的形式存储请求的数据
    D、request.method:获取请求的方式值(GET POST)
    E、request.files:获取上传文件,类型为MultiDict
    F、request.cookies:获取用户的身份
    G、request.host:主机Ip:port
    H、request.host_url:主机地址
    I、request.referrer:请求的来源
    J、request.headers:请求头信息,类似字典,可通过关键词获取对应得信息
    K、request.json:解析JSON数据,如果没有则返回None
    L、request.values:包含args和form的数据,类型为CombineMultiDict
    M、request.url:统一资源定位符:请求的地址
4、request方法(详细)
(01)request.user_agent:获取用户代理,包含用户的客户端类型,操作系统类型等信息
(02)request.headers:获取一个Werkzeug的EnvironHeaders对象,包含首部字段,可以以字典的形式操作
(03)request.application:获取服务器请求的应用类型
(04)request.charset:获取请求的编码格式
(05)request.url-charset:获取使用url的编码格式
(06)request.host:获取服务器请求的主机地址
(07)request.host_url:获取服务器请求的完整主机地址(包括协议)
(08)request.base_url:获取url的基础地址(?参数之前的地址)
(09)request.url:获取浏览器的完整url地址
(10)request.url_root:获取浏览器的根url
(11)request.path:查看浏览器匹配的路由(路由路径)
(12)request.full_path:查看浏览器传递给Flask服务的数据(路由+参数)
(13)request.blueprint:获取项目当前使用蓝图的信息
(14)request.endpoint:获取与当前请求相匹配的端点值
(15)request.referrer:获取浏览器请求发起的源URL
(16)request.scheme:获取请求的URL模式/协议(http或https)
(17)request.method:获取浏览器请求的http方法(get/post)
(18)request.cookies:获取一个包含索引随请求提交的cookies字典校验
(19)request.args:获取get请求方法的类字典参数信息
    A、可以获取到Werkzeug的ImmutableMultiDict对象,存储解析后的查询字符串,可通过字典的方式获取键和值
    B、要想获取未解析的原生查询字符串,可以使用query_string属性
    C、request.args.get(需求键):可以找到键时,可以通过指定键获取到数据;无法找到键时,request会返回None,Flask服务器会报500错误
    D、request.args.get(需求键,默认值):为其设置默认值,无法获取到键时直接使用默认值
    E、request.args.getlist(需求键):有多个重复键的数据时获取多个,返回到一个列表中
(20)request.data:接收所有请求参数,是请求体的原始数据
(21)request.get_data():获取请求中的数据,默认读取为字节字符串(bytestring),将as_text参数设置为True则返回值将是unicode字符串
(22)request.files:获取请求的文件类型的数据
    A、获取一个Werkzeug的MultiDict对象,包含所有上传文件,可以使用字典的形式获取文件
    B、使用的键为文件input标签中的name属性值,对应的值为Werkzeug的FileStorage对象
    C、可以调用save()方法并传入保存路径来保存文件
(23)request.form:获取post请求数据的方法,获取一个Werkzeug的ImmutableMultiDict对象,包含解析后的表单数据,表单字段值通过input标签的name属性值作为键获取
(24)request.values:获取一个Werkzeug的CombinedMultiDict对象,结合了args和form属性值
(25)request.is_json:通过MIME类型判断是否为JSON数据,返回布尔类型的值
(26)request.get_json():作为JSON解析并返回数据
    A、如果MIME类似不是JSON,返回None(除非force设置为True)
    B、解析出错抛出Werkzeug提供的BadRequest异常(如果未开启调试模式,则返回400错误码)
    C、如果silent设置为True,则返回None,cache设置是否缓存解析后的JSON数据
(27)request.json:包含解析后的JSON数据,内部调用get_json(),通过字典的方式获取键值
5、get请求处理:请求数据存放在url或请求头部
(1)get请求是web请求当中最简单快捷的请求,只需要在url后面添加?发起get请求即可,在开发的过程当中要灵活的拼接get请求
(2)页面的默认的请求方式,请求的数据是以明文的形式放在路由上面,以?开头的键值对,中间以&连接多个参数,通常使用get请求来获取服务器的资源
(3)需要通过request.args来接受参数,request.args是一个类字典对象,可以给get设置默认值
(4)Flask通过request方法来接收前端请求过来的参数
(5)新的浏览器支持中文(内部自动将中文转换成符合url规范的数据),
    A、浏览器中访问链接>>http://127.0.0.1:5000/?user=Flask&time&gender=男
    B、通过路由匹配,在对应的视图函数执行处理逻辑,通过request获取传递的参数
(6)request.args.__str__():获取浏览器传递的数据
    A、可以获取到Werkzeug的ImmutableMultiDict对象,存储解析后的查询字符串,可通过字典的方式获取键和值
    B、要想获取未解析的原生查询字符串,可以使用query_string属性
    C、简单示例:ImmutableMultiDict([('user','Flask'),('time',''),('gender','男')])
(7)request.args.get(需求键)方法
    A、可以在url参数中找到对应的数据键时,可以通过指定键获取到数据(类似字典取值)
    B、无法在url参数中找到对应的数据键时,request会返回内置的None,Flask服务器会报500错误
        >>先判断得到的数据是否为None,再进行处理
        >>通过request.args.get(需求键,默认值)的方式为其设置默认值,当无法获取到键时,直接使用默认值代替
(8)request.args.getlist(需求键):浏览器中有多个重复键的数据时,获取多个数据,将数据返回到一个列表中
6、get表单请求
(1)前端form标签设置
    A、利用HTML的表单和组件向服务器发起请求,需要对form标签设置参数
    B、method:请求方式,默认是GET
    C、action:请求的地址,就是将数据提交到哪里,默认提交到当前路由
    D、enctype:表名用来表述请求数据不单单是字符
    E、name:表单提交数据的参数,后端通过对应name值获取数据(必须有name标签,否者前端不发送数据)
        <form method="get" action="/index/">
            <input type="text">
            <button>搜索</button>
        </form>
(2)后get请求步骤
    A、需要获取到form表单页面,对页面进行设置
    B、前端输入数据,发送请求
    C、路由部分,获取get请求传参
    D、视图函数+数据库,获得数据,返回到页面
    E、进行模版渲染,展示数据
"""
from functools import wraps
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template

basic = "F:/MyProject"

# 创建web服务器(http)实例:内置方法__name__是预定义变量,被设置为使用本模块,html存放的路径,静态文件的路径
app = Flask(__name__)


# 定义一个装饰器,判断数据权限验证
def loginValid(func):
    # 使用原理的名称作为返回函数
    @wraps(func)
    def decorator(*args, **kwargs):
        username = request.cookies.get("username")
        user_id = request.cookies.get("user_id")
        # 判断二者有值
        if username and user_id:
            # 返回被装饰函数的功能
            return func(*args, **kwargs)
        return redirect('/')
    return decorator


# get方法获取浏览器请求的数据参数
@app.route('/demo/get')
@loginValid
def get_demo():
    # 查看get请求向服务器传递的路由
    print(request.path)
    # 查看get请求向服务器传递的数据
    print(request.full_path)
    # 查看get请求向服务器传递的参数对象
    print(request.args.__str__())
    # 获取get请求的某个参数数据
    print(request.args.get('name'))
    # get请求的url参数中不存在时,进行判断处理
    user = request.args.get('user')
    if user is None:
        print("参数数据user不存在~")
    else:
        print(f"参数数据user为:{user}")
    # get请求的url参数中不存在时,进行默认值设置
    print(request.args.get('nick', '未知'))
    # get请求的url参数中存在多个同键数据时,进行列表处理
    print(request.args.getlist('hobby'))
    data = '这是一个get请求'
    return render_template('base1.html', **locals())

# 启动项目服务器--可以通过参数更改,通常网站的页面需要放到网站服务器上,用户无法双击打开
if __name__ == '__main__':
    def run(self):
        app.run(
            # host:主机地址
            host="localhost",
            # port:访问端口
            port=80,
            # debug:调试模式,测试环境True,生产环境Fasle
            debug=True,
            # use_reloader:自动重启
            use_reloader=True
        )
;