# 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 )