当前位置:   article > 正文

【Django】响应数据、重定向(redirect)、反向解析(reverse)_django redirect

django redirect
1.HttpResponse

Django中有一个封装好的HttpResponse类,通过该类可以方便给前端返回简单的数据
用法

response = HttpResponse(content=响应数据, content_type=响应体类型, status=状态码)
content_type默认是text/html,status默认是200
  • 1
  • 2

如果不想手动指定状态码,我们还可以使用HttpResponse的子类,已经封装好了各种响应状态的类

类名状态码
HttpResponse200
HttpResponsePermanentRedirect301
HttpResponseRedirect302
HttpResponseBadRequest400
HttpResponseForbidden403
HttpResponseNotFound404
HttpResponseNotAllowed405

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('HttpResponseView/', views.HttpResponseView.as_view())
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

views.py

from django.views import View
from django import http


class HttpResponseView(View):
    def get(self, request):
        # return http.HttpResponsePermanentRedirect()  # 301
        # return http.HttpResponseRedirect()  # 302
        # return http.HttpResponseBadRequest()  # 400
        # return http.HttpResponseForbidden()  # 403
        # return http.HttpResponseNotFound('找不到页面')  # 404
        # return http.HttpResponseNotAllowed()  # 405
        return http.HttpResponse('你好,这个是HttpResponseView返回的数据')  # 200
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
2.返回JSON数据

urls.py

from django.urls import path
from . import views

urlpatterns = [
	...
    path('json_res/', views.ResponseJSON.as_view())
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

views.py

from django.views import View
from django import http

class ResponseJSON(View):
    def get(self, request):
        dic = {
            'name': 'xiaohei',
            'age': 18
        }
        return http.JsonResponse(dic)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
3.重定向和反向解析

如果用户在访问一个页面需要给他跳转另一个页面,我们可以使用重定向函数redirect()进行页面重定向

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('HttpResponseView/', views.HttpResponseView.as_view()),
    path('json_res/', views.ResponseJSON.as_view()),
    path('index/',views.IndexView.as_view())
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

views.py

from django.shortcuts import render, redirect
from django.views import View
from django import http


class HttpResponseView(View):
    def get(self, request):
        return http.HttpResponse('你好,这个是HttpResponseView返回的数据')  # 200


class ResponseJSON(View):
    def get(self, request):
        dic = {
            'name': 'xiaohei',
            'age': 18
        }
        return http.JsonResponse(dic)


class IndexView(View):
    def get(self, request):
        return redirect('/HttpResponseView/')  # 页面重定向

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

当我们访问http://localhost:8000/index/的时候就会自动跳转到http://localhost:8000/HttpResponseView/这个页面

4.反向解析

我们在path写路由地址的时候会确定用户应该请求哪个地址才能得到对应的数据,如果在开发过程中多次使用到该地址,但是以后需要修改该地址就会涉及很多地方全部都要修改,如果我们给该地址取一个名字,再由该名字获取地址那就简单多了。我们可以使用reverse()函数进行路由反向解析

urls.py(总路由)

from django.urls import path
from django.urls import include

urlpatterns = [
	...
    path('', include('request_response.urls')),
    # 起别名,include()函数传入两个参数,一个元组(('子路由', '子应用名字')),另一个是命名空间(用于区分不同的子应用)
    path('', include(('redirect.urls', 'redirect'), namespace='redirect'))
]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

urls.py(子路由)

from django.urls import path
from . import views

urlpatterns = [
	...
    path('redirect/', views.ReturnToIndex.as_view()),
    # path()函数,多加一个name属性
    path('index/', views.IndexView.as_view(), name='index'),

]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

views.py

from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View
from django import http


class HttpResponseView(View):
    def get(self, request):
        return http.HttpResponse('你好,这个是HttpResponseView返回的数据')  # 200
...

class ReturnToIndex(View):
    def get(self, request):
    	# 需要导入:from django.urls import reverse
    	# reverse('namespace:name') 
        real_url = reverse('redirect:index')
        # reverse需要导入,from django.shortcuts import redirect
        return redirect(real_url)  


class IndexView(View):
    def get(self, request):
        return http.HttpResponse('这里是首页')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

因为我们已经指定了命名空间和别名,再通过它们进行反向解析,所以我们现在访问redirect/页面会正常跳转到index/页面,当我们修改子路由的index/这个路径的时候程序也能正常工作

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号