Django URL视图

视图

视图一般都写在app的 views.py中。并且视图的第一个参数永远都是request(一个HttpRequest)对象。返回值必须django.http.response.HttpResponseBase的子类的对象

这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。比如这个请求是添加一篇博客,那么可以通过request来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。视图函数的返回结果必须是 HttpResponseBase 对象或者子类的对象。

  • views.py文件示例代码

      from django.http import HttpResponse
      def book_list(request):
      	return HttpResponse("书籍列表!")
    
  • urls.py文件做映射

      from django.urls import path
      from book import views
      urlpatterns = [
      	path('book/',views.book_list)
      ]
    

视图参数

url中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url,是https://www.jianshu.com/p/a5aab9c4978e后面的a5aab9c4978e就是这篇文章的id,那么简书的文章详情页面的url就可以写成 https://www.jianshu.com/p/ ,其中id就是文章的id。

指定参数形式

  • views.py示例代码:

      def book_detail(request,book_id):
      	text = "您输入的书籍的id是:%s" % book_id
      	return HttpResponse(text)
    
  • urls.py代码示例

      from django.contrib import admin
      from django.urls import path
      from book import views
      urlpatterns = [
      	path('admin/', admin.site.urls),
      	path('book/',views.book_list),
      	path('book/<book_id>/',views.book_detail)
      ]	
    

访问127.0.0.1/book/1/即可。

查询字符串形式

  • views.py示例代码

      def book_detail(request):        #注意!查询字符串形式不需要其他的参数
      	book_id = request.GET.get("id")  #id表示参数名称 也可以写成book_id = request.GET['id']
      	text = "您输入的书籍id是:%s" % book_id
      	return HttpResponse(text)
    
  • urls.py示例代码

      urlpatterns = [
      	path('admin/', admin.site.urls),
      	path('book/',views.book_list),
      	path('book/detail/',views.book_detail)
      ]
    

访问127.0.0.1/book/detail/?id=1即可

URL中包含另外一个urls模块

在我们的项目中,不可能只有一个app,如果把所有的app的views中的视图都放在urls.py中进行映射,肯定会让代码显得非常乱。因此django给我们提供了一个方法,可以在app内部包含自己的url匹配规则,而在项目的urls.py中再统一包含这个app的 urls,使用这个技术需要借助include函数。

	from django.contrib import admin
	from django.urls import path,include
	urlpatterns = [
		path('admin/', admin.site.urls),
		path('book/',include("book.urls"))
	]

简单的说就是把项目的urls.py通过include函数包含其他app的urls.py文件。

Path函数

path函数的定义为: path(route,view,name=None,kwargs=None)。

  • route参数

    route参数:url的匹配规则。这个参数中可以指定url中需要传递的参数

  • views参数

    视图的返回值

  • name参数

    这个参数是给这个url取个名字的,这在项目比较大,url比较多的时候用处很大。

  • kwargs参数

    有时候想给视图函数传递一些额外的参数,就可以通过kwargs参数进行传递。这个参数接收一个字典。传到视图函数中的时候,会作为一个关键字参数传过去。

      例如:
    
      from django.urls import path
      from . import views
      urlpatterns = [
      	path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
      ]
    

    那么以后在访问 blog/2019/这个url的时候,会将foo=bar作为关键字参数传给 year_archive函数。

URL命名

  • 为什么要给url命名?

    因为url是经常变化的,如果在代码中写死可能会经常改代码,给url取个名字,以后使用url的时候就使用他的名字进行反转。

  • 如何给一个url指定名称?

    在path函数中,传递一个‘name’参数即可,示例代码如下

      urlpatters = [
      	path('signin/',views.login,name ='login')
      ]
    
  • url反转

    上述示例代码name = 'login' 给url命名了。在views.py文件中就不需要写死参数,需要根据名字进行反转。

      from django.shortcuts import redirect,reverse
      ...
      ...
      return redirect(reverse('login'))
    

    这个代码的意思就是,通过login这个名字对应的url反转,反转之后的urls传递给redirect

    所以网页显示的就是/singin/

  • 应用命名空间

    有多个app之间,有可能产生同名的url。这时候为了避免反转url的时候产生混淆。可以使用应用命名空间来做区分。在app中的urls.py文件中可以指定命名空间。

    应用命名空间的变量是app_name = 'front'(示例)

    url进行反转的时候就可以这样写:'front:login',这样的话,django就会从front命名空间下的login。

posted @ 2019-03-20 10:31  苏黎世的从前  阅读(171)  评论(0编辑  收藏  举报