Django之url使用小技巧、项目类视图

我先说一下url中踩过的坑
1.url中的’r’是什么意思?例如:url(r'^index/', views.index),
正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的’/‘反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:"/“和"n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。
2.url中的’$'是什么意思?

url(r'^index/', views.index),
url(r'^myArticle/', views.myArticle),

如上的两个url,当想访问myArticle页面时,就会一直跳转到index页面,这是因为没有在index后添加上以’$'符结尾,当以index开头所有的URL都会跳转到这里,从而无法访问到myArticle页面。

那么正确的做法应该是在’/‘后面加上我们的’$’:

url(r'^index/$', views.index),
url(r'^myArticle/', views.myArticle),

我们在做一个项目的时候,往往不知道怎样去设置url路由,今天我给大家介绍几种常见的配置。

  1. 流线型配置
    \OurBlog\Article\urls.py
#coding:utf-8
from django.conf.urls import url
#流线型url配置方法1
from Article import views

urlpatterns = [
    url(r'^$', views.index),
    url(r'^index/', views.index),
    url(r'^myArticle/', views.myArticle),
    url(r'^myPicture/', views.myPicture),
    url(r'^aboutMe/', views.aboutMe),
    url(r'^connectMe/', views.connectMe),
]

\OurBlog\Article\urls.py

from django.conf.urls import url
#流线型url配置方法2

urlpatterns = [
    url(r'^$', "Article.views.index"),
    url(r'^index/', "Article.views.index"),
    url(r'^myArticle/', "Article.views.myArticle"),
    url(r'^myPicture/', "Article.views.myPicture"),
    url(r'^aboutMe/', "Article.views.aboutMe"),
    url(r'^connectMe/', "Article.views.connectMe"),
]

\OurBlog\Article\urls.py

from django.conf.urls import url,patterns
#流线型url配置方法3

urlpatterns = patterns('Article.views',
    url(r'^$', "index"),
    url(r'^index/', "index"),
    url(r'^myArticle/', "myArticle"),
    url(r'^myPicture/', "myPicture"),
    url(r'^aboutMe/', "aboutMe"),
    url(r'^connectMe/', "connectMe"),
)

url传参:
我们在最初学习的时候,就接触了利用匹配组进行url传参
我们在url上用组匹配匹配到的内容会传递给视图
\OurBlog\Article\urls.py

#coding:utf-8
from django.conf.urls import url,patterns

urlpatterns = patterns('Article.views',
    #........
    url(r'^connectMe/(\d{4})', "connectMe"), #组匹配
)

所以,我们在视图里需要参数接收
\OurBlog\Article\views.py

def connectMe(request,number):
    	return render(request, "article/aboutMe.html")

但是,我们现在要考虑两个点

  1. 我们是否可以加入命名组
    \OurBlog\Article\urls.py
#coding:utf-8
from django.conf.urls import url,patterns

#流线型url配置方法3
urlpatterns = patterns('Article.views',
    #........
    url(r'^connectMe/(?P<year>\d{4})', "connectMe"), #组匹配
)

url当中命名组是year,views的形成必须是year
\OurBlog\Article\views.py

def connectMe(request,year):
     return render(request, "article/aboutMe.html")
  1. 当前有两个urls
    如果在主url当中,我们发生了命名组匹配,我们的子url视图函数都需要有这个参数
    \OurBlog\OurBlog\urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^ckeditor/', include('ckeditor_uploader.urls')),
    url(r'^Article(?P<name>\d)/', include('Article.urls')), #指出我们app的url
]

\OurBlog\Article\views.py

扫描二维码关注公众号,回复: 4531128 查看本文章
def index(request,name):
    	return render(request, "article/index.html")

那么除了上述几种方法外,我们还可以对url传入指定值进行传参

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    #......
  	url(r'^Article(?P<name>\d)/', include('Article.urls')), #指出我们app的url
	url(r'^Article/', include('Article.urls'),{"name": "while"}),  # 传入指定值
    url(r'^Article(?P<name>\d)/', include('Article.urls'),{"name": "while"}),  # 传入指定值
]

1、 传入指定值的字典的键要和视图函数的形参对应
2、 传入指定参数的优先级大于url匹配参数
3、 所有从url上获取下来的参数都是字符串,如果传入数字,记得转变类型

url反向代理
随着APP的增多,路由的复杂,普通的写法容易出错

  1. 在url当中,对路由进行命名
#coding:utf-8
from django.conf.urls import url,patterns
#路由反向代理
from Article.views import *

urlpatterns = [
    url(r'^$', index),
    url(r'^index/', index, name = "ArticleIndex"),
    #......
]
  1. 前端部分使用url标签加载,点击相应的 位置即可实现页面跳转
<li><a href="{% url 'ArticleIndex' %}">网站首页</a></li>
  <ul>
    <li><a href="/aboutMe/">个人简介</a></li>
    <li><a href="/myPicture/">个人相册</a></li>
  </ul>
</li>
  1. 视图函数当中使用比较繁复
from django.shortcuts import redirect #跳转
from django.core.urlresolvers import reverse #解析路由反向代理

def connectMe(request):
    return redirect(reverse("ArticleIndex")) #重定向的时候也可以用反向路由

项目类视图
以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式支持的时候,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
1、 接口开发
接口的特点,对于同一个url可以有不同的操作,类视图满足这一点
2、 我们请求的方式不止有get和post,还有:
Put
Delete
Head
这些方法,Django默认在我们的requests请求当中已经封装好get和post方法
Request.GET
Request.POST
没有对其他方法的封装,这个在我们使用的时候,就需要通过视图类来定义

from django.http import JsonResponse  #返回json数据
from django.views.generic import View #视图类的父类

class Api(View):
    def get(self,request):
        """
        这个方法处理get请求
        :param request:
        :return:
        """
        return JsonResponse({"method": request.method})

    def post(self, request):
        """
        这个方法处理get请求
        :param request:
        :return:
        """
        return JsonResponse({"method": request.method})

那么我们在urls调用要注意,需要使用as_view()方法。as_view()是一个类方法,调用它返回一个view方法,view转到dispatch(),dispatch()会自动判断当前的请求方式,根据这个请求方式找到对应的真正view函数

from Article.views import *

urlpatterns = [
#......
    url(r'^api/', Api.as_view()),
]

效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ALLENsakaru/article/details/84205415