Django-服务器端对象

本文介绍了Django中处理服务器端请求的方法,包括通过request获取HTTP方法、数据和Header信息,关注了POST提交时的注意事项,如CSRF验证和Header键的格式。此外,详细讲解了HttpResponse、JsonResponse、HttpResponseRedirect的用法,以及如何处理URL参数和重定向。同时,提到了Django的序列化和文件上传,并简单提及了中间件及其执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Django-服务器端对象

  1. request

    通过request.method可以查看提交方式

  2. request 解析数据

    1. get

       request.environ
       request.GET
       
       #如果提交数据方式为:
       http://localhost:8080/position/12/?name=tom&pass=123
       
       获取方式:
       
       request.GET.get('name')
       request.GET['pass']
      
    2. post

      a. post数据为form-data或者x-www-urlencoded

           if request.method=='POST':
               id=request.POST.get('id')
               
               #当客户端数据为{‘key’:[1,3,6,7]} 时(发送数据需加:tranditional:true),
               list=request.POST.getlist('do')
               password=request.POST['password']
      

      b. post数据为json

        if request.method=='POST':
       	
       	
           data=json.loads(request.body)
      
           id=data['id']
           password=data['password']
      
  3. 获取Header中的信息

    1. request.META.get(“header key”) 用于获取header的信息

    2. 注意的是header key必须增加前缀HTTP,同时大写,例如你的key为username,那么应该写成:request.META.get(“HTTP_USERNAME”)

    3. 另外就是当你的header key中带有中横线,那么自动会被转成下划线,例如my-user的写成: request.META.get(“HTTP_MY_USER”)

       	token=request.META.get('HTTP_TOKEN')
       	print(token)
      

    注意post提交出错

    1. url最后应该加/ 如:http://localhost:8080/position/add/

    2. settings.py中可能要注释掉:# ‘django.middleware.csrf.CsrfViewMiddleware’,
      为什么要这样呢,因为django默认会验证token(每次请求django都会带回来一个token,m名字叫X-CSRFtoken).如果要顺利请求则要取出cookie中的token,然后ojax.setRequestHeader(‘X-CSRFtoken’,token)。

    3. cookie

       request.COOKIES:包含用户发来的所有数据,这个COOKIES就是一个字典,获			取方法有以下2种
       
       获取cookis,获取用户发来请求中的cookies
       
       	request.COOKIES['username111']
       	request.COOKIES.get('username111')
      
  4. HttpResponse

    1. HttpResponse(数据,状态码,cookie)

       from django.http import HttpResponse,response,JsonResponse
       #resp=response.HttpResponse('I AM LOGIN')
       return HttpResponse(json.dumps(content),
       status=200,charset='utf-8',content_type='application/json')
      
    2. cookie

       set_cookie(key, value='', max_age=None, expires=None):设置Cookie
      
      1. key、value都是字符串类型

      2. max_age是一个整数,表示在指定秒数后过期

      3. expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSerializer时才可序列化

      4. max_age与expires二选一

      5. 如果不指定过期时间,则两个星期后过期

         date_int=datetime.utcnow()+timedelta(hours=1)
        	content=json.dumps({"id":"001","name":"天猫"})
         response = HttpResponse(content, content_type='application/json; charset=utf-8')
        
         # response.write('<h1>' + 'ok' + '</h1>')
         # response.set_cookie('h1', '你好', 604800)
         # response.set_cookie('h1', '你好', max_age=None, expires=date_int)
         response.set_cookie('h1', '你好'.encode('utf8'), expires=date_int)
         return response
        

      注意

       '你好'.encode('utf8')
      
  5. JsonResponse

     from django.http import HttpResponse,response,JsonResponse
     def login(request):
         todo_list = [
             {"id": "1", "content": "吃饭"},
             {"id": "2", "content": "吃饭"},
         ]
         response = JsonResponse(todo_list, safe=False)
    
  6. HttpResponseRedirect

    通过HttpResponseRedirect 和 reverse实现重定向

     from django.http import HttpResponse,HttpResponseRedirect,HttpRequest
     from django.urls import reverse
     
     def search(request,condition):
     	# return HttpResponse('search')
     	return HttpResponseRedirect('/position/')
    

    还可以通过reverse()对url的name进行解析:

     return HttpResponseRedirect(reverse('index'))
    

    如果指定模块(即使当前模块跳转也要写明)

     return HttpResponseRedirect(reverse('position:index'))
    

    了解:

    1. 而如果url中包含参数,如下类型的url:

      url(r’^blog/(?P<blog_id>\d+)/$’, BlogDetailView.as_view(), name=‘blog_id’)

    2. 如果我们还采用上述方式实现重定向,则会提示缺少一个参数:blog_id。此时需要在reverse()中添加参数:

       blog_id = blog.id   #获取到博客的id号
       return HttpResponseRedirect(reverse('index', args=(blog_id)))
      
    3. 如果包含多个字段,可以采用如下形式:

      url(r’^blog/(?P<blog_id>\d+)/(?P<user_id>\d+)、$’, BlogDetailView.as_view(), name=‘blog_id’)

      return HttpResponseRedirect(reverse(‘index’, kwargs={‘blog_id’: blog_id, ‘user_id’: us}

  7. 序列化

    关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

    1. serializers

       from django.core import serializers
      
       ret = models.BookType.objects.all()
      
       data = serializers.serialize("json", ret)
      
    2. json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:

       import json 
       from datetime import date 
       from datetime import datetime 
          
       class JsonCustomEncoder(json.JSONEncoder): 
           
           def default(self, field): 
            
               if isinstance(field, datetime): 
                   return o.strftime('%Y-%m-%d %H:%M:%S') 
               elif isinstance(field, date): 
                   return o.strftime('%Y-%m-%d') 
               else: 
                   return json.JSONEncoder.default(self, field) 
          
          
       # ds = json.dumps(d, cls=JsonCustomEncoder) 
      
  8. 文件上传

     request.FILS	
    
  9. 中间件

    中间件中可以定义五个方法,分别是:

     process_request(self,request)
     process_view(self, request, callback, callback_args, callback_kwargs)
     process_template_response(self,request,response)
     process_exception(self, request, exception)
     process_response(self, request, response)
    

    前二个方法是从前往后执行的,后三个方法是从后往前执行的

    在根目录下建立:‘mymiddleware.middleware.userauth.RequestAuth’

    方式一:

     from django.http import HttpResponse
     from django.utils.deprecation import MiddlewareMixin
     class RequestAuth(MiddlewareMixin):
         def process_request(self, request):
             print(request.GET.get('id'))
             print('333')
             # return HttpResponse('sorry')
         def process_view(self, request, callback, callback_args, callback_kwargs):
             i = 1
             print('444')
             pass
         def process_exception(self, request, exception):
             print('555')
             return HttpResponse(exception)
         def process_response(self, request, response):
             print('666')
             return response
    

    方式二

     from django.http import HttpResponse
     #from django.utils.deprecation import MiddlewareMixin
     class RequestAuth(object):
         def __init__(self, get_response):
             print('111')
             self.get_response = get_response
         
         def __call__(self, request):
             print('222')
             print(request.GET.get('id'))
             return self.get_response(request)
         def process_request(self, request):
             print(request.GET.get('id'))
             print('333')
             # return HttpResponse('sorry')
     
         def process_view(self, request, callback, callback_args, callback_kwargs):
             i = 1
             print('444')
             pass
     	
         def process_exception(self, request, exception):
             print('555')
             return HttpResponse(exception)
     
         def process_response(self, request, response):
             print('666')
             return response
    

    这种方式def process_request(self, request):不会执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值