5.Django URL详解

前面我们编写小demo的时候有说过两个东西视图(views.py)和url(urls.py),视图 相信已经有一定理解,url我们只是照着写,读者可能还是云里雾里,今天我们主要就介绍一下这个东西。

1.基本概念

Url是什么?
举个例子:https://litets.com/article/2019/4/11/320.html这就是一个Url, 主要有3部分组成:

https/http litets.com /article/2019/4/11/320.html
协议 主机 路径

当我们在浏览器输入这一长串东西的时候,实际上就是向某个地方(服务器)找东西。具体流程不再多少。

2.Django如何处理一个请求

当以用户请求Django站点下的页面时候,Django处理流程:
1.加载root目录想的URLconf,即项目下面的urls.py 2.加载各个模块下的urls.py,茶灶urlpatterns 3.依次匹配每个url,匹配到就停下来 4.匹配成功后调用对应的视图处理程序 5.如果没有匹配到将会抛出异常。

3.实例

打开我们的urls.py

from django.urls import path

from news.views import index,viewstest

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', index),
    path('viewstest/', viewstest)
]

默认会有一个admin路径,后面会讲到现在忽略。
下面的index/和viewstest/是我们前面添加的。
path:
第一个参数就是路径, 第二参数是视图出来函数 第三个是可选参数。

修改views.py

# 添加一个add方法,功能是加法计算
# http://127.0.0.1:8000/add/?a=10&b=4
def add(request):
    a = request.GET['a'] # 获取到参数a
    b = request.GET['b'] # 获取到参数b

    return HttpResponse('a+b=%d' % (int(a) + int(b)))

修改urls.py

from news.views import index,viewstest,add

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', index),
    path('viewstest/', viewstest),
    path('add/', add)
]

重新启动服务器。

浏览器里面输入http://127.0.0.1:8000/add/?a=10&b=4 将会在页面展示:

a+b=14

此种方式是最原始的传参方式。
我们修改视图函数,使用另一种方式:
修改view.py

def add(request, a, b):
    # a = request.GET['a']
    # b = request.GET['b']

    return HttpResponse('a+b=%d' % (int(a) + int(b)))

修改urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', index),
    path('viewstest/', viewstest),
    path('add/<a>/<b>', add)
]

然后在浏览器输入:http://127.0.0.1:8000/add/10/5 将会展示

a+b=15

如果觉得add()里面将字符串转换成int太繁琐,还可以修改 path:

#注意低版本写法不同
 path('add/<int:a>/<int:b>', add)

int就是参数的类型,Django里面自动转换。

4.使用正则匹配

在旧版本中path直接支持正则,新版需要使用到re_path. 我们修改urls.py

# 将path修改为re_path
 from django.urls import re_path

from news.views import index,viewstest,add

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', index),
    path('viewstest/', viewstest),
    # 编写正则
    re_path(r'^add/(?P<a>[0-9]{2})/(?P<b>[0-9]{1})', add)
]

其中?P是固定写法,<参数名称>就是视图函数的参数,比如,

5.包含其它的URLconfs

urls是可以导入其他的urls。 只需要使用include将其他urls.py引入即可

from django.urls import include, path
urlpatterns = [
    path('xxx/', include('xxx.urls')),
    path('abc/', include('abc.urls')),
]

6.下一节

6.Django模版

声明:原创文章,版权所有,转载请注明出处,https://litets.com。