django 学习笔记-视图接收http请求

视图接收http请求

在http请求和响应过程中, 用户往往会在请求过程中发送请求信息给服务端.
	# print(request.method) # 获取http请求动作  GET
    # print(request.path)   #获取路由地址  /student/index
    # print(request.path_info)  # /student/index
    # print(request.get_port()) #获取端口	 8000
    
# 补充说明: 只要引入queryDict模块,一般得到的都是一个querydict字典
     from django.http.request import QueryDict
     QueryDict 是一个经过封装的字典,提供了基本的字典操作,还提供额外的操作给开发者获取字典内部的数据.
     因为python基本数据类型dict是无法让字典在一个key下指向多个值的,所以django封装了一个新的字典来实现.
 # 获取querydict字典数据的方法
     # 常用方法:
        get()     # 根据指定的键获取一个值
        getlist() # 根据指定的键获取所有值,以列表格式返回
        dict()    # 把整个查询字符串对象转换成字典格式[此时参数会去重]  
        
        
1. 查询字符串[Query String]
   所谓的查询字符串就是url地址上面?号后面的数据,例如:
   http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
   上面name=xiaoming&pwd=123456就是查询字符串
   可以通过 request.GET 来获取,注意: GET不是http请求,也就是说,只要地址上有查询字符串,都可以通过 		request.GET 来获取.
  # 常用方法:
        get()     # 根据指定的键获取一个值
        getlist() # 根据指定的键获取所有值,以列表格式返回
        dict()    # 把整个查询字符串对象转换成字典格式[此时参数会去重]    

2. 请求体数据

	#获取请求体数据(请求正文) request body

  **注意:常用的http请求方法中,只有post,put和patch请求才会有请求体数据**
 	request.body  # 获取原始的请求体 :在postman的body里面的raw下输入的内容,请求方式是post
	request.POST  # 只能获取表单数据:在postman的body里面的form-data下输入的内容
 ** request.body(raw内容) 和request.POST(表单内容)只能选一种获取,不能同时获取,否则会报错

3. 请求头报文信息
    
    # 获取请求头信息  request.headers 
    # 获取在postman里面的Headers里面的内容
    """
    {
        'Content-Type': 'multipart/form-data; 
        'User-Agent': 'PostmanRuntime/7.26.10', 
        'Host': '127.0.0.1:8000', 
    }
    """
   # request.META  
    """
    {
        'SERVER_NAME': 'ubuntu',      # 当前项目运行的服务器名称
        'SERVER_PORT': '8000',        # 当前服务端对外提供服务的端口 
        'REMOTE_ADDR': '127.0.0.1',   # 客户端的IP地址[代理IP]
    }
    """
    # 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
    print(request.META.get("REMOTE_ADDR")) # 127.0.0.1

    """获取自定义请求头,属于客户端开发人员自己声明的请求头(书写在Headers里面)"""
    print(request.headers.get("Company")) # OldobyEd

4. 上传文件
   # 获取上传文件 request.FILES
    
   # 获取上传文件 在postman里面的body里面的form-data里面的key里面输入文件名,
    request.FILES
    
1 . 获取查询字符串的参数

所谓的查询字符串就是url地址上面?号后面的数据,例如:
http://127.0.0.1:8000/index?name=xiaoming&pwd=123456
上面' name=xiaoming&pwd=123456 ' 就是查询字符串
可以通过 request.GET 来获取,注意: GET不是http请求,

也就是说只要地址上有查询字符串,都可以通过 request.GET 来获取.

通过子应用views中的视图函数来获取

home/views.py代码

"""查询字符串[Query String]"""
def index(request):
    # request是一个对象,是客户端请求web服务端时,wsgi服务器把客户端请求的报文解析成数据保存到request

    print(request) # <WSGIRequest: GET '/student/index'>
    # request本质就是 WSGIRequest的实例对象,父类是 from django.http.request import HttpRequest
    # request提供用于获取http请求的信息的大部分属性都是父类声明的

    # print(request.method) # 获取http请求动作  GET
    # print(request.path)   #获取路由地址  /student/index
    # print(request.path_info)  # /student/index
    # print(request.get_port()) #获取端口	 8000

   获取http请求的查询字符串(Query String)或者查询参数(Query Params)
    print(request.GET)
    """
   postman的请求地址: 
        GET   127.0.0.1:8000/student/index?name=xiaoming&pwd=123&lve=swimming&lve=shop"""
   ''' 
   那么打印效果:
        <QueryDict: {'name': ['xiaoming'], 'pwd': ['123'], 'lve': ['swimming', 'shop']}>
       分析:
        	这次就获取到了name和pwd,lve参数以及参数的值
       注意:
            因为客户端传递过来的参数有可能多个值的情况,所以查询字符串返回的数据值都是列表格式'''
补充说明:
 from django.http.request import QueryDict
 QueryDict 是一个经过封装的字典,提供了基本的字典操作,还提供额外的操作给开发者获取字典内部的数据.
 因为python基本数据类型dict是无法让字典在一个key下指向多个值的情况,所以django封装了一个新的字典来实现.
        
    ## 获取这个字典数据的常用方法:
            get()     # 根据指定的键获取一个值
            getlist() # 根据指定的键获取所有值,以列表格式返回
            dict()    # 把整个查询字符串对象转换成字典格式[此时参数会去重]    
   
    # 获取一个参数值
    # 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
    print(request.GET.get("name")) # xiaoming
    print(request.GET["lve"])      # shop  只会获取最后一个值,后面的值覆盖了前面的值
   
	# 有部分参数就一个名称对应多个值,获取参数的所有值我们使用getlist
    print(request.GET.getlist("lve")) # ['swimming', 'shop']
    
    # 把整个查询字符串转换成字典格式
    print(request.GET.dict())  # {'name': 'xiaoming', 'pwd': '123', 'lve': 'shop'}
    
    # 视图函数必须有返回值
    return HttpResponse("hello querystring")
  

home/urls.py路由绑定视图代码

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    ...
]
2 . 获取请求体数据

注意:常用的http请求方法中,只有post,put和patch请求才会有请求体数据

home/views.py 视图函数代码

def index(request):
    """获取请求体数据(请求正文) request body"""
    

    # print(request.body)  # 获取原始的请求体 :在postman的body里面的raw下输入的内容,请求方式是post

	运行的manage里面打印的结果
    打印效果:是json格式
        b'{\n    "username":"xiaoming",\n    "age":16\n}'

    说明:
        通过body来获取数据,处理过程如下,比较麻烦:
        import json
        body_dict = json.loads(request.body)  ->json 反序列化为字典格式
        print(body_dict)    # {'username': 'xiaoming', 'age': 16}
   
    在打印下面的结果是先注释上面的json反序列化代码..
    # request.POST 只能获取表单数据:在postman的body里面的form-data下输入的内容
    print( request.POST )
    """
    打印效果:
        <QueryDict: {'username': ['xiaohuihui'], 'passsword': ['123456']}>
    """
 ## request.body(raw内容) 和request.POST(表单内容)只能选一种获取,不能同时获取,否则会报错
    return HttpResponse("hello body")

home/urls.py 路由绑定视图代码

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    ...
]
3 . 获取请求头数据

home/views.py 视图函数代码

def headers(request):
    
    """获取请求头信息"""
    print(request.headers)  # 获取在postman里面的Headers里面的内容
    """
    {
        'Content-Type': 'multipart/form-data; 
        'User-Agent': 'PostmanRuntime/7.26.10', 
        'Host': '127.0.0.1:8000', 
    }
    """
    print(request.META)  
    """
    {
        'SERVER_NAME': 'ubuntu',      # 当前项目运行的服务器名称
        'SERVER_PORT': '8000',        # 当前服务端对外提供服务的端口 
        'REMOTE_ADDR': '127.0.0.1',   # 客户端的IP地址[代理IP]
    }
    """
    # 因为QueryDict是一个伪字典对象,所以可以通过get或者中括号获取到数据
    print(request.META.get("REMOTE_ADDR")) # 127.0.0.1

    """获取自定义请求头,属于客户端开发人员自己声明的请求头(书写在Headers里面)"""
    print(request.headers.get("Company")) # OldobyEdu

    return HttpResponse("request header")
    

home/urls.py 路由绑定视图代码

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    ...
]
4 . 获取上传文件

home/views.py视图函数代码

def files(request):
    """获取上传文件"""
    
    # 获取上传文件 在postman里面的body里面的form-data里面的key里面输入文件名,
    # print( request.FILES )
    
    """
	form-data类型选择file,在右边的selectfiles里面上传文件,在这里就可以获取到.
    打印效果:
        <MultiValueDict: {'myfile': [<InMemoryUploadedFile: release-roadmap.688d8d65db0b.png (image/png)>]}>
        MultiValueDict 就是QueryDict的父类
    """
    print( request.FILES.get("myfile") )  #获取文件名
   
	# 获取文件对象<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    print( type( request.FILES.get("myfile") ) ) 
   
	return HttpResponse("request files")

home/urls.py 路由绑定视图代码

from django.urls import path

from . import views
urlpatterns = [
    path("index", views.index ),
    ...
]

posted @ 2021-05-31 22:36  豆#豆  阅读(189)  评论(0)    收藏  举报