URL,统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738。互联网的每个文件都有它相对应的一个URL,指出文件的路径位置,URL也就是所谓的网站网址,在Django中,URL也称为URLconf。
URL编写规则
在每个App中新建一个urls.py项目结构如下:
注意是在之前创建好的项目名称,我这里的项目名称就是untitled3这个目录,可以在cmd终端用命令:django-admin startproject untitled3创建的项目,后面的项目名称可以自行命名。我之间就不小心在项目目录下创建urls.py导致打开浏览器的时候啥都没有显示,而现在这里的urls.py是在你创建项目的时候就会自动生成一个同名的文件夹,而这个urls.py会自动生成的。来编写根目录下urls.py编写url规则:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('index.urls'))
]
上述代码里面两个path就设定了两个URL地址,分别是Admin站点管理和首页地址,其中Admin站点管理是在创建项目时已经自动生成的,第二个path的意思是include将该URL分发给index的urls.py处理,当然我们新建的index下的urls.py也要修改:
from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
]
结构大致相同,上述path导入了同一目录下的views.py文件,该文件用于写视图函数,处理URL请求信息并返回网页内容给用户,所以这个时候我们又要编写views.py函数了:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("hello word")
index函数必须设置阐述request,表示当前用户的请求对象,包含用户名,请求内容和请求方式等信息,执行完成后要使用return来将结果返回,否则就会报错,启动项目在浏览器打开网页:http://127.0.0.1:8000/
带变量的URL
URL的变量类型有字符类型,整形,slug,uuid,大部分都是使用的字符类型与整形。
那我们修改一下index的urls.py里的函数:
from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
path('<str:year>/<int:month>/<slug:day>',views.mydate), #添加带有字符类型,整形,和slug的url。
]
在URL里使用变量符号<>可以为URL设置变量,在括号里面以冒号划分为两部分,前面的str,int,slug表示的是变量的数据类型,后面就是变量名,变量名可以自行命名。
之后在views.py中编写视图函数mydate的处理方法:
from django.shortcuts import render
from django.http import HttpResponse
def mydate(request,year,month,day):
return HttpResponse(str(year) + '/'+ str(month) +'/'+ str(day))
mydate里面有4个函数参数,其中参数year,month,day来自URL的变量,URL的变量要与视图函数的参数一一对应,如果没有对应上就会报错,启动项目输入:http://127.0.0.1:8000/2019/12/03
在上述例子中,URL里的变量分别代表年月日。从变量的数据类型可以看出来,变量值只要符合数据格式都是合法的,使得某些变量不符合日期格式要求。也可以使用正则表达式,就得导入re_path模块:
from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
path('<str:year>/<int:month>/<slug:day>',views.mydate), #添加带有字符类型,整形,和slug的url。
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html',views.mydate) #使用了正则比上面书写规范点
]
设置参数name
除了在URL里面设置变量之外,Django还可以对URL进行命名,
在urls.py添加如下代码
from django.urls import path,re_path
re_path('(?P<year>[0-9]{4}).html',views.myyear,name='myyear')
在views.py添加如下代码
def myyear(request,year):
return render(request,'1.html')
在之前创建好的templates文件夹中添加1.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>Hello word</p>
<div><a href="/2019.html">2019 old Archive</a> </div>
<div><a href="{% url 'myyear' 2019 %}">2019 Archive</a> </div>
</body>
</html>
第一个标签a很好理解,就是一个地址,第二个标签a的href为{% url ‘myyear’ 2019 %},这是Django里面的模板语法,以{%%}表示,url ‘myyear’ 表示的是将命名为myyear的URL地址信息作为href属性值,2019是URL的变量year,如果没有设置变量值也不需要添加。myyear(request,year)这个里面的year是一个变量,因为在re_path里面设置了Pyear所以就需要在视图里添加year
注意了注意了
这里我之前遇到过一个问题就是运行打开浏览器是报错:‘set’ object is not reversible,这个错误的原因是因为我把项目中的urls.py文件里的urlpatterns列表的[ ]写成了{ },字典是无序的,所以报了不能逆转的错误,改为urlpatterns[ ]就可以了。
从以上例子可以看到模板的myyear与urls.py所设置的参数name是一一对应的,参数name的作用是对该URL地址信息进行命名,然后在HTML模板中使用可以生成相应的URL信息。里面有两种方法,第一种就是设置每个标签a的href属性值,如果URL地址发生改变,就要去修改每个标签a的href属性值,所以就有了第二种更为方便的方法,在URL设置参数name,只要参数name的值不变,无论URL地址如何变幻都不用修改标签a的href属性值。
设置额外参数
除了之前那个name='myyear‘设置参数之外,还可以使用字典的数据类型传递,没有具体命名,只要是字典形式就可以,设置而外参数必须是字典的形式表示,参数只能在视图函数读取和使用,一个键值对代表一个参数,参数值没有数据格式显示。
index下的urls.py添加如下代码:
re_path('dict/(?P<year>[0-9]{4}).htm',views.myyear_dict,{'month':'12','day':'4'},name='myyear_dict')
index下的views.py添加代码如下:
def myyear_dict(request,year,month,day):
return render(request,'2.html',{'month':month,'day':day})
templates下创建2.html添加代码如下:
<a href="{% url 'myyear_dict' 2019 %}">2019 {{month}}{{year}}Archive</a>
输出网址:http://127.0.0.1:8000/dict/2019.htm