一、django 静态文件配置

/mysite1/settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]

/templates/timer.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>timer</title>
<link rel="stylesheet" href="/static/timer.css">
</head>
<body>
<h4>当前时间:{{ date }}</h4>
</body>
<script src="/static/jquery-3.2.1.min.js"></script>
<script src="/static/timer.js"></script>
</html>

/static/...

效果

二、简单得路由配置

URL配置(URLconf) 就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。

from django.urls import path,re_path

from app01 import views

urlpatterns = [
re_path(r'^articles/2003/$',views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$',views.year_archive), # year_archive(request,‘2009’)
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',views.month_archive),
re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$',views.article_detail),
]
from django.shortcuts import render,HttpResponse

def special_case_2003(request):

    return HttpResponse('special_case_2003')

def year_archive(request,y):

    return HttpResponse(y)

def month_archive(request,y,m):

    return HttpResponse(y+'-'+m)

def article_detail(request,y,m,d):

    return HttpResponse(y+'-'+m+'-'+d)

注意:

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

 示例:

 一些请求的例子:

/articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '', '')。
/articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。
/articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。
/articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '', '', '')。

三、有名分组

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

下面是以上URLconf 使用命名组的重写:

from django.urls import path,re_path

from app01 import views

urlpatterns = [
re_path(r'^articles/2003/$',views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$',views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})$',views.month_archive),
# views.month_archive(request, year='2005', month='03')
]
from django.shortcuts import render,HttpResponse

def special_case_2003(request):

    return HttpResponse('special_case_2003')

def year_archive(request,year):

    return HttpResponse(year)

def month_archive(request,year,month):

    return HttpResponse(year+'-'+month)

这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

/articles/2005/03/ 请求将调用views.month_archive(request, year='', month='')函数,而不是views.month_archive(request, '', '')。
/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='', month='', day='')。

在实际应用中,这意味你的URLconf 会更加明晰且不容易产生参数顺序问题的错误 —— 你可以在你的视图函数定义中重新安排参数的顺序。当然,这些好处是以简洁为代价;

四、分发

from django.contrib import admin
from django.urls import path,re_path,include urlpatterns = [
path('admin/', admin.site.urls),
path('blog/',include('blog.urls'))
]
# blog.urls

from django.contrib import admin
from django.urls import path,re_path,include from blog import views urlpatterns = [
path('index/',views.index)
]
from django.shortcuts import render,HttpResponse

def index(request):

    return HttpResponse('OKok')

补充 

re_path(r'^$',views.index),

re_path(r'^',include('blog.urls')),

五、反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

  • 在模板中:使用url 模板标签。
  • 在Python 代码中:使用from django.urls import reverse()函数

在模板中

urls.py

from django.urls import path,re_path,include

from app01 import views

urlpatterns = [
path('login.html/',views.login,name='Log'), ]

views.py

from django.shortcuts import render,HttpResponse

def login(request):
if(request.method == 'POST'):
user = request.POST.get('user')
pwd = request.POST.get('pwd') if(user == 'alice' and pwd == ''):
return HttpResponse('登录成功')
else:
return HttpResponse('<h4 style="color:red;">登录失败</h4>') else:
return render(request,'login.html')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
{# url 控制器 action 默认 当前 反向解析 模板语法{{ }} 和{% %} 两种 #}
<form action="{% url 'Log' %}" method="post">
用户名:<input type="text" name="user">
密码:<input type="password" name="pwd">
<input type="submit">
</form>
</body>
</html>

补充:

在python中

urls.py

from django.urls import path,re_path,include

from app01 import views

urlpatterns = [
re_path(r'^articles/2003/$',views.special_case_2003,name='s_c_2003'),
re_path(r'^articles/(?P<year>[0-9]{4})/$',views.year_archive,name='y'),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})$',views.month_archive), path('index/',views.index,name='indexes')
]

views.py

from django.shortcuts import render,HttpResponse

# 在python 里面反向解析 不想写死url 在以后会很灵活

from django.urls import reverse

def index(request):
print(reverse('indexes'))
# /app01/index/ return HttpResponse('OKOK') def special_case_2003(request): # request 不管用不用,一定要写
url = reverse('s_c_2003')
print(url) # /app01/articles/2003/
return HttpResponse('special_case_2003') def year_archive(request,year):
url = reverse('y',args=(year,)) # 这里有这正则表达式
print(url) # /app01/articles/2018/
return HttpResponse(year) def month_archive(request,year,month):
return HttpResponse(year+'-'+month)

注:当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment 而不是comment

六、名称空间

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
 
project的urls.py:
from django.urls import path,re_path,include

urlpatterns = [
path('app01/',include(('app01.urls','app01'))), # 右面是名称空间, 命名空间的意义
path('app02/',include(('app02.urls','app02'))), ]

app01.urls:

from django.urls import path,re_path,include
from app01 import views urlpatterns = [
path('index/', views.index, name='index') ]

app02.urls:

from django.urls import path, re_path, include
from app02 import views urlpatterns = [
path('index/', views.index, name='index') ]

app01.views

from django.shortcuts import render,HttpResponse
from django.urls import reverse def index(request): return HttpResponse(reverse('app01:index'))

app02.views

from django.shortcuts import render,HttpResponse
from django.urls import reverse def index(request): return HttpResponse(reverse('app02:index'))

七、django2.0版的path

思考情况如下:

urlpatterns = [
re_path('articles/(?P<year>[0-9]{4})/', year_archive),
re_path('article/(?P<article_id>[a-zA-Z0-9]+)/detail/', detail_view),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/edit/', edit_view),
re_path('articles/(?P<article_id>[a-zA-Z0-9]+)/delete/', delete_view),
]

考虑下这样的两个问题:

第一个问题,函数 year_archive 中year参数是字符串类型的,因此需要先转化为整数类型的变量值,当然year=int(year) 不会有诸如如TypeError或者ValueError的异常。那么有没有一种方法,在url中,使得这一转化步骤可以由Django自动完成?

第二个问题,三个路由中article_id都是同样的正则表达式,但是你需要写三遍,当之后article_id规则改变后,需要同时修改三处代码,那么有没有一种方法,只需修改一处即可?

在Django2.0中,可以使用 path 解决以上的两个问题。

示例

简单例子:

from django.urls import path
from app01 import views urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive), # year_archive(request,year)
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:str_data>/', views.article_detail),
]
from django.shortcuts import render,HttpResponse

def special_case_2003(request):

    return HttpResponse('special_case_2003')

def year_archive(request,year):
print(year,type(year))
return HttpResponse(year) def month_archive(request,year,month):
print(year,type(year))
print(month,type(month))
return HttpResponse(month) def article_detail(request,year,month,str_data):
print(str_data,type(str_data))
return HttpResponse(str_data)

基本规则:

  • 使用尖括号(<>)从url中捕获值。
  • 捕获值中可以包含一个转化器类型(converter type),比如使用 <int:name> 捕获一个整数变量。如果没有转化器,将匹配任何字符串,当然也包括了 / 字符。
  • 无需添加前导斜杠。

以下是根据2.0官方文档 而整理的示例分析表:

path转化器

文档原文是Path converters,暂且翻译为转化器。

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符

注册自定义转化器

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型
  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

urlconvert.py

'''
http://www.cnblogs.com/yuanchenqi/articles/8931472.html
https://docs.djangoproject.com/en/2.0/topics/http/urls/#example
'''
# 自定义转换器 class MonConvert:
regex = '[0-9]{2}' def to_python(self,value):
return int(value) def to_url(self,value):
return '%04d'%value

urls.py  (使用register_converter 将其注册到URL配置中)

from django.urls import path,register_converter
from app01 import views from app01.urlconvert import MonConvert # 注册转换器 注册自定义的转换器
register_converter(MonConvert,'mm') urlpatterns = [
# 自己注册的转换器
path('articles/<mm:month>/', views.year_archive),
]

views.py

from django.shortcuts import render,HttpResponse

def year_archive(request,month):
print(month,type(month))
return HttpResponse(month)

总结:

django urls:
简单配置
第一站: url 路径匹配
有名分组
。。。 按关联字传参 (?P...) () 可传参
分发:
多个app
反向解析
不想写死url 别名name
名称空间
防止名字起重了 配合反向解析使用
path # django 2.0 的特性
内部数值不会转换 正则反复使用

含正则的 反向解析
https://www.cnblogs.com/yuanchenqi/articles/7629939.html

Django - 路由层(URLconf)的更多相关文章

  1. Django 路由层(urlconf)

    Django 的路由层(URLconf) URL配置(conf)就像是Django所支撑的网站的目录; 本质就是:URL与调用该URL执行的视图函数的映射表; 通俗的讲:就是用户使用哪个url,URL ...

  2. 解析Django路由层URLconf

    目录: 一  Django中路由的作用 二  路由的分组 三  路由分发 四  反向解析 五  名称空间 六  Django2.0版的path 一.Django中路由的作用 URL配置(URLconf ...

  3. Django2.0路由层-URLconf

    目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...

  4. 关于Django路由层简单笔记

    Django—路由层 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个U ...

  5. Django路由层与视图层

    表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...

  6. Django路由层与视图层、pycharm虚拟环境

    一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实 ...

  7. 关于Django中路由层(URL-conf)

    关于路由层 路由层其实就是项目中urls.py那个文件,那里面存放着url和视图函数的对应关系它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  8. Django路由层

    路由层简单配置 urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^articles/2003/$', views.special_ca ...

  9. Django --- 路由层(urls)

    目录 1.orm表关系如何建立 2.django请求生命周期流程图 3.urls.py路由层 4.路由匹配 5.无名分组 6.有名分组 7.反向解析 8.路由分发 9.名称空间 10.伪静态 11.虚 ...

  10. django 路由层 伪静态网页 虚拟环境 视图层

    路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页 虚拟环境 视图层 JsonResponse FBV与CBV 文件上传 项目urls.py下面 from app01 import ...

随机推荐

  1. apache -- xampp配置虚拟主机

    <VirtualHost *:80> ServerName www.myblog.com DocumentRoot "F:/Code/myblog"<Direct ...

  2. 图像边缘检測--OpenCV之cvCanny函数

    图像边缘检測--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  3. java与c#的语法对比

    1,命名空间与包 C#为了把实现相似功能的类组织在一起,引入了命名空间的概念(namespace) Java中与此对应的东西叫做包(package) 2,类的访问控制方面的不同 C#只有两种:publ ...

  4. [Java并发包学习七]解密ThreadLocal

    概述 相信读者在网上也看了非常多关于ThreadLocal的资料,非常多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程訪 ...

  5. unity3d游戏开发学习分享之表面着色器讲解

    一.三种着色器的书写格式: 1.surface shaders, 指的是表面着色器 2.vertex and fragment shaders and 指的是顶点和片段着色器 3.fixed func ...

  6. NGUI之Toggle实现单选框

    一:使用步骤——创建一个checkboxes 1.首先在UI Root下建立一个Sprite,设置一张贴图,当作按钮的背景. 然后为其添加碰撞组件和Toggle组件 2.为第一个Sprite建立一个子 ...

  7. OpenCV学习:Windows+VS2010+OpenCV配置

    OpenCV下载: 百度云下载:https://pan.baidu.com/s/1mhAExdu (2.4.9版本) 下载完成后,双击运行exe,选择输出目录,我选择的是C:\OpenCV 配置环境变 ...

  8. Python 入门(九)迭代

    什么是迭代 在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration). 在Python中,迭代是通过 for ...

  9. idea & datagrip 注册码

    CNEKJPQZEX-eyJsaWNlbnNlSWQiOiJDTkVLSlBRWkVYIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  10. UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView

    « 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的 ...