Flask学习-3-server对象(request、response模块)

ⅰ亾dé卋堺 提交于 2019-11-26 22:27:26

一、request模块

get:网址方式
post:表单方式

  1. method == ‘GET’

    1. 方式1

      id = request.args
      print(id)
      print(id.get('telephoe'))
      
    2. 方式2

      qs = request.query_string.decode('utf-8')
      regex = re.compile(r'id=(\w+)&charset=(.+)')
      res = re.findall(regex, qs)
      
    3. 方式3

      qs = request.query_string.decode('utf-8')
      res = re.split(r'[=&]',qs)
      print(res)
      
  2. method == ‘POST’

    1. form data 表单【form或values或get_data()字节码】
      headers:content-type:application/x-www-form-urlencoded

      form = request.form
      print(form)
      print(form['telephone']
      
    2. x-www-form-urlencoded【form或values或get_data()字节码】
      headers:content-type:application/x-www-form-urlencoded

      form = request.form
      print(form)
      print(form['telephone']
      
    3. json【get_json()或get_data()字节码】
      headers:content-type:application/json

      data = request.get_json()	# {'id': '008', 'name': 'tom', 'test': '测试'}
      print(data.get('telephone'))
      print(request.get_data())		# b'{"id":"008","name":"tom","test":"\xe6\xb5\x8b\xe8\xaf\x95"}'
      

    form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。

    1. x-www-form-urlencoded
      当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
    2. multipart/form-data
      当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。【enctype="multipart/form-data"是上传二进制数据;它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法】
  3. request.values 获取所有值
    get 和 post 都可以使用

    args返回请求中的参数,values返回请求中的参数和form

    print(args):

     ImmutableMultiDict([('id', '008'), ('psw', 'dflef'), ('test', '汉语')])
    

    print(values):

     CombinedMultiDict([ImmutableMultiDict([('id', '008'), ('psw', 'dflef'), ('test', '汉语')]), ImmutableMultiDict([])])
    
  4. request.headers

    request.headers['token']
    
  5. url属性

    1. requets.url 获取当前请求的完整路径,包括查询字符串
    2. request.base_url 获取基本路径

二、response模块

  1. 方法或属性描述

    1. headers:response服务器传输数据包的头部
    2. status
    3. status_code:服务器的状态码(200、404、500)
    4. data:response的body,就是 return ‘success’ ==response.data=‘success’
    5. get_json(force=False, silent=False, cache=True)
    6. is_json
    7. max_cookie_size
    8. mimetype
    9. set_cookie(key, value=”, max_age=None, expires=None, path=’/’, domain=None, secure=False, httponly=False, samesite=None)
  2. 多个返回值

    @app.route('/response/')
    def response():
    	#body,status_code,headers
    	return 'Hello3', 200, {"sherlock":"XX"}
    
  3. json.dumps() 和jsonify 区别

    1. json.dumps()时字段值为text/html

      jsonify()将我们传入的json形式的数据序列化成json字符串,作为响应的body,并设置响应的Content-Type为application/json,构建出响应返回至客户端

    2. json.dumps()可以赋值给rsp.data

      jsonify()不可以赋值给rsp.data,要么直接返回jsonify(),要么make_response(jsonify())

    3. json.dumps()不可以对时间对象直接操作,需要datetime.now().strftime(’%Y-%m-%d’)

      jsonify()可以直接对时间对象操作,不过转换成英文时间形式

    @user.route('/response/')
    def reponse():
        dict_data = {"id":"001","name":"tom"}
        dict_data_t = {"id":"002","name":"rose","date":datetime.now().strftime('%Y-%m-%d')}
        list_dict_data = [
            {"id":"001","hobby":["read","sleep"]},
            {"id":"001","test":{"1":"qw","2":"aaa"}}
        ]
    
        rsp = make_response()
        rsp.data = json.dumps(dict_data)
        rsp.data = json.dumps(dict_data_t)
        rsp.data = json.dumps(list_dict_data)
        rsp.headers["sherlock"] = "XX"
        return rsp
    
        # from flask import jsonify
        # dict_test = {"id":"001","date":datetime.now()}
        # rsp = make_response(jsonify(dict_test))
        # return rsp
    
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!