URL配置(URLconf)就是Django 所支撑的网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行
典型例子:
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加’/’。
其效果就是:
我们定义了urls.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
]
访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时不再向后面自动添加/,就会提示找不到页面。
使用伪静态是为了方便搜索引擎优化(SEO)收录
SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
搜索引擎优化
一、内部优化
(1)META标签优化:例如:TITLE,KEYWORDS,DESCRIPTION等的优化;
(2)内部链接的优化,包括相关性链接(Tag标签),锚文本链接,各导航链接,及图片链接;
(3)网站内容更新:每天保持站内的更新(主要是文章的更新等)。
二、外部优化
(1)外部链接类别:友情链接、博客、论坛、B2B、新闻、分类信息、贴吧、知道、百科、站群、相关信息网等尽量保持链接的多样性;
(2)外链运营:每天添加一定数量的外部链接,使关键词排名稳定提升;
(3)外链选择:与一些和你网站相关性比较高,整体质量比较好的网站交换友情链接,巩固稳定关键词排名。
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结,在SEO方面,伪静态和静态页面的功能是相同的,但是伪静态本质上还是动态页面,所以消耗资源是和动态页面一样的,而且因为Rewrite服务器还需要消耗额外的资源。
# 路由层
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
]
# 视图层
def year_archive(request, year):
'''
year: 接收路由层传递过来的参数
'''
return HttpResponse('当前是%s年' % year)
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)
在Python 正则表达式中,命名正则表达式组的语法是(?Ppattern),其中name 是组的名称,pattern 是要匹配的模式。
按照有名分组,上面的示例应该这样写:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^blog/$', views.blog),
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P[0-9]{4})/$' , views.year_archive),
]
有名分组与无名分组在使用上没有太大差别,只是有名分组对应的视图函数的形参名字必须和分组名保持一致,也就是说,有名分组会把分出来的参数按照关键字参数传递给视图函数,所以一定要保持名字上的一致
在实际应用中,这意味你的URLconf 会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价。
一个Django项目里面有多个app时,不同app的视图层可能会有名字相同的视图函数,为了避免名称冲突,我们通过路由分发的方式在总路由中进行分发,使每个app在自身内部进行路由的配置
# 导入include
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 匹配顺序:匹配app01成功则相应include函数,去到app01文件夹下的urls文件中继续匹配后续路由
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))
]
# app01中的urls文件内容
from app01 import views
urlpatterns = [
url(r'^test/', views.test),
]
如果浏览器输入app01/test/,就会响应到app01下views中的test取执行
在视图函数中重定向的地址如果是写死的,url地址变更时,需要所有的url都进行修改,比较麻烦,我们可以通过反向解析,动态获取url的地址
# 路由层
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/$', views.test, name='test')
]
# 视图层
from django.shortcuts import reverse
def re_url():
url=reverse('test(url地址的别名)')
# 如果做了分组(意味着需要接受参数)
url=reverse('test(url地址的别名)',args=[],kwargs={})
return redirect(url)
{# django模板层 #}
{% url 'url地址的别名'%}
# 如果做了分组(意味着需要接受参数)
{% url 'url地址的别名' 参数1 参数2 ... 参数n %}
这样,即使路由层中的路由更改了,我们也可以不用修改视图层或模板层的路由地址,即便我们不应该去修改路由层中的路由。
路由分发时,可以指定名称空间:
# 导入include
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02'))
]
名称空间可以在视图层进行反向解析使用
个人不推荐使用名称空间