Django之重定向

1.什么是重定向
重定向:就是通过各种方法将各种网络请求重新定个方向转到其它位置
Django中的重定向: 当视图函数处理完成一个逻辑后,不需要向客户端呈现数据,而是转回到其它页面(可以理解为调用其它的视图函数)
通俗理解为:视图转向视图,即一个视图跳转到另一个视图.而不是直接返回到模板html.
2.什么时候用到重定向
如添加成功、修改成功、删除成功后显示数据列表,而数据的列表视图已经开发完成,此时不需要重新编写获取列表的代码,而是转到这个视图
3.HttpResponseRedirect
Django中提供了HttpResponseRedirect对象实现重定向功能,这个类继承自HttpResponse,被定义在django.http模块中,返回的状态码为302
1.直接返回模板html


普通视图函数
def normalViewFn(request): # 直接返回模板html return render(request, 'booktest/area.html') ```
以上代码演示的是视图函数返回模板html.而我们要做的是视图转向到视图. 所以我们继续往下看.
2.重定向:转向到视图
``` from django.http import HttpResponseRedirect
定义重定义向视图,转向首页
def red(request): return HttpResponseRedirect('/') ```
分析: 
这里重定向到 "/" , 其实相当于在浏览器重新访问了"http://127.0.0.1:8000/".这是会找到 / 对应的视图函数,然后执行视图函数内部代码.
画图分析:
首页对应的视图函数假如是index.
![](https://s1.51cto.com/images/blog/201804/20/73bd5726493d34100d4adb01ac8d0f88.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)![](https://s1.51cto.com/images/blog/201804/20/1323c9320fa0e39ee78c9cd85d2b7489.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
3.重定向(简写版)
``` from django.shortcuts import redirect
定义重定义向视图简写函数,转向首页
def redirectViewShortFn(request): return redirect('/') ```
注意:
redirect()函数的介绍请看后边章节.
4.状态码302补充
302用来做临时跳转:   比如未登陆的用户访问用户中心重定向到登录页面。
  访问404页面会重新定向到首页。 
4.redirect()函数
1.介绍
redirect()函数用于重定向.是HttpResponseRedirect()的简写.
我们想要了解一个函数,需要先读一读他的源码.
函数源码如下: (django版本为2.0.1.)
def redirect(to, *args, permanent=False, **kwargs):
  Return an HttpResponseRedirect to the appropriate URL for the arguments
  passed.
  The arguments could be:
      * A model: the model's `get_absolute_url()` function will be called.
      * A view name, possibly with arguments: `urls.reverse()` will be used
        to reverse-resolve the name.
      * A URL, which will be used as-is for the redirect location.
  By default issues a temporary redirect; pass permanent=True to issue a
  permanent redirect
  redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
  return redirect_class(resolve_url(to, *args, **kwargs))
核心翻译如下:
将HttpResponseRedirect返回给传递的参数的相应URL。
怎么理解这句话呢? 其实就是根据你传递的第一个参数to,来判断,到底要转向到哪?转向到一个模型,视图,还是一个url.
to参数可以为以下几种情况:
一个模型:模型的get_absolute_url()函数将被调用。
视图名称,可能使用参数:reverse()将用于反向解析名称。
一个绝对的或相对的URL,将按原样用于重定向位置。
默认情况下会发出临时重定向; 如果修改参数permanent为True将发出永久重定向。
2. 转向到视图
如果要重定向到视图,我们需要使用反向解析reverse()
1.传递路径参数
def fan3(request,id1,id2):
    return HttpResponse(id1+' ' + id2)

def fan4(request):
    #重定向到fan3
    return redirect(reverse('booktest:fan3',args=(10,100)))
注意: 
reverse('namespace:name',关键字参数).
​ 这里的namespace是应用的命名空间.
​ name是view视图的别名.

关于fan3的namespace和name的相关配置:
1.在项目的urls.py中做如下配置:
urlpatterns = [ path('admin/', admin.site.urls), url(r'^',include('booktest.urls',namespace='booktest')), ]
2.在应用的urls.py中做如下配置:
app_name = 'booktest' # django2.0版本需要添加app_name= 'namespace' urlpatterns = [ url(r'^fan(\d+)_(\d+)/$', views.fan3, name='fan3'), ]
2.传递关键字参数
def fan5(request,id,age):
    return HttpResponse(id+' '+age)

def fan6(request):
  #重定向到fan5
  return redirect(reverse('booktest:fan5',kwargs={'id':100,'age':30}))
关于fan5的namespace和name的相关配置:
1.在项目的urls.py中做的配置与上一个相同:
2.在应用的urls.py中做如下配置:
app_name = 'booktest' # django2.0版本需要添加app_name= 'namespace'
urlpatterns = [
    url(r'^fan(?P<id>\d+)(?P<age>\d+)/$', views.fan5, name='fan5')
]
3.传递普通参数
def updateOrderState(request):
   get_data = request.GET
   response = HttpResponseRedirect(reverse('order:orderQuery') + "?args=" + json.dumps(get_data))
    return response
def orderQuery(request):
    args = request.GET.get('args')   
    args_dict = json.loads(args) 
    xxx
这里我们可以直接在reverse()后边通过?拼接参数. 只不过要传递很多数据的时候,一般我们采用的是将字典转换为字符串.
json.dumps()  可以将字典变为字符串.
json.loads()  可以将字符串变为字典.

转载于:https://blog.51cto.com/13517854/2105755

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值