静态文件配置

1、项目下面新建一个文件夹static

settings.py中最后添加

STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static")
]

2、目录结构:

static

  my_demo1

    timer.js

timer.js

$("h4").click(function () {
$(this).css('color', 'red');
});

timer.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-1.4.4.min.js"></script> </head>
<body>
<h4>{{ ctime }}</h4> </body>
<script src="/static/my_demo1/timer.js"></script> </html>

简单路由配置

大佬博客:https://www.cnblogs.com/yuanchenqi/articles/8931472.html

urls.py

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),
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),
]

注意:

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

示例:

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

简单配置示例

1.1 不包含正则

urls.py
re_path(r'^articles/2003/$', views.special_case_2003), views.py
def special_case_2003(request): return HttpResponse("special_case_2003")

1.2正则位置参数1

re_path(r'^articles/([0-9]{4})/$', views.year_archive),

def year_archive(request, year):

    return HttpResponse(year)

1.3正则位置参数2

re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),

def month_archive(request, year, month):

    return HttpResponse(year + "-" + month)

1.4正则位置参数3

re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),

def article_detail(request, year, month, day):

    return HttpResponse(year + "-" + month + "-" + day)

有名分组

命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。视图接受参数就是views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')

示例:

re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive2),

def year_archive2(request, year=''):

    return HttpResponse(year)

注意:urls中的参数名称必须和views函数中接受的名称保持一致

路由分发

1个Django 项目里面有多个APP目录大家共有一个 url容易造成混淆,于是路由分发(include)让每个APP的拥有了自己单独的url

re_path(r'^blog/', include('blog.urls')),  # 应用名blog
re_path(r'^/', include('blog.urls')), # 访问地址不输入应用名
访问url
http://127.0.0.1:8000/my_demo2/articles/2001/
总urls
re_path(r'^my_demo2/', include('my_demo2.urls')), 分urls
from django.urls import re_path
from my_demo2 import views urlpatterns = [
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive3),
] def year_archive3(request, year=''):
return HttpResponse(year) 访问url
http://127.0.0.1:8000/articles/2001/
总urls
re_path(r'^', include('my_demo2.urls')), 其它不变

反向解析

定义:随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超链接忘记修改,有办法让链接根据正则表达式动态生成吗? 就是用反向解析的办法。

url.py中, name='Log '

页面中,{% url Log %}

视图中,from django.urls import reverse

  url = reverse("Log")

  url = reverse("y_a",args=(4009,)) # app01/articles/([0-9]{4})/  args=(4009,)是为了替换路由中的正则

反向解析与视图函数没有直接关系(可以在任一个视图函数中解析)

总urls.py

urlpatterns = [
path('admin/', admin.site.urls),
path('timer/', views.timer, name="Log"),
re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
] views.py def year_archive(request, year):
url = reverse("news-year-archive", args=(year,))
return HttpResponse(url) def timer(request):
import time
ctime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
return render(request, "timer.html", {"ctime": ctime}) timer.js <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-1.4.4.min.js"></script> </head>
<body>
<h4>{{ ctime }}</h4>
<form action="{% url 'Log' %}">
<h5>123333333333</h5>
<input type="submit">
</form> </body>
<script src="/static/my_demo1/timer.js"></script> </html>
替换正则
url = reverse("s_c_2003",args=(4009,))

大佬总结

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

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

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

urls.py:

from django.conf.urls import url

from . import views

urlpatterns = [
#...
re_path(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]

在模板中:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在python中:

from django.urls import reverse
from django.http import HttpResponseRedirect def redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,))) # 同redirect("/path/")

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

名称空间

re_path(r'^app01/', include("app01.urls",namespace="app01")),  # 方式一,py3可能不认可

re_path(r'^app01/', include(("app01.urls","app01"))),  # 方式二

return  HttpResponse(reverse("app01:index"))

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

由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回
我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。
页面地址:
http://127.0.0.1:8000/my_demo2/index/ 总urls.py
from django.contrib import admin
from django.urls import path, re_path, include urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^my_demo1/', include(("my_demo1.urls", "my_demo1"))),
re_path(r'^my_demo2/', include(("my_demo2.urls", "my_demo2"))), ] my_demo1-urls.py from django.urls import re_path
from my_demo1 import views urlpatterns = [
re_path(r'^index/', views.index, name="index"),
] my_demo1-views.py from django.shortcuts import HttpResponse, reverse def index(request):
return HttpResponse(reverse("my_demo1:index")) my_demo2-urls.py from django.urls import re_path
from my_demo2 import views urlpatterns = [
re_path(r'^index/', views.index, name="index"),
] my_demo2-views.py from django.shortcuts import HttpResponse, reverse def index(request):
return HttpResponse(reverse("my_demo2:index"))

注意:以上示例中,名称空间是俩个应用,其它都是一个应用

django2.0版的path

用正则表达式捕获值,需要使用re_path(),而不是前面介绍的path()。

re_path(r'^articles/([0-9]{4})/$', views.year_archive),

  ^   以什么开头
  $   以什么结尾
  r   正则

思考情况如下:

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 . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),
]

基本规则:

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

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

path转化器

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反向引用。

例子:

class FourDigitYearConverter:
regex = '[0-9]{4}'
def to_python(self, value):
return int(value)
def to_url(self, value):
return '%04d' % value

使用register_converter 将其注册到URL配置中:

from django.urls import register_converter, path
from . import converters, views
register_converter(converters.FourDigitYearConverter, 'yyyy')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<yyyy:year>/', views.year_archive),
...
]

自定义转换器

Path Converter是一个类,定义Converter类需要包含下面的属性或方法:

  • regex属性,字符串类型
  • to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。
  • to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。
class MonConvert:
regex = "[0-9]{2}"
def to_python(self, value):
return int(value)
def to_url(self, value):
return "%04d" % value 注册转换器
from app01.urlconvert import MonConvert
register_converter(MonConvert,"mm") path("articles/<mm:month>", views.path_month)

最新文章

  1. 深入理解CSS过渡transition
  2. 清华学堂 列车调度(Train)
  3. BZOJ 2761: [JLOI2011]不重复数字 水题
  4. MySQL的高可用设计方案的记录
  5. 十八、AWT绘图技术
  6. IE6兼容性问题及IE6常见bug详细汇总
  7. Word 文档插入时间日期禁止自动更新
  8. Spark RDD概念学习系列之RDD的依赖关系(宽依赖和窄依赖)(三)
  9. OpenCV——识别手写体数字
  10. extern外部方法使用C#简单样例
  11. Why attitude is more important than IQ
  12. 【Unity Tips】备忘录(扫盲篇)
  13. aiohttp AppRunner的用法
  14. gitlab 安装和使用
  15. MT【260】单调函数
  16. Java WebSocket HttpSession与WebSocket Session的关联
  17. java中对于二位数组的简单操作,进而可以递推复杂操作
  18. Volley网络通信框架
  19. Scrapy环境安装
  20. Html——拖放

热门文章

  1. vue|html5 form 验证
  2. WebGL编程指南理论分析之物体的运动和点光源
  3. postman--安装及Interceptor插件
  4. C语言指针使用小记 (深入理解C指针 读后小记)
  5. shell 脚本实战笔记(2)--环境变量PATH的恩怨情仇
  6. python编码问题 decode与encode
  7. vim 程序编辑器
  8. this的区别
  9. PHP 设计模式系列 —— 资源库模式(Repository)
  10. solr相关