Python(四十六)url路由分配及模板渲染方式
1. URL基本概念及格式:
1.1. URL的引入:
对于访问者来说:知道了URL就可以去进行访问。
对于服务者来说:设置好URL,别人才可以来访问我。
1.2. URL概念
URL(Uniform Resoure Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息有指出文件的位置以及浏览器应该怎么处理它。
1.3. URL格式
http://127.0.0.1:8000/hello/
URL解释:
schema://host[:port#]/path/.../[?query-string][#anchor]
schema:指定使用的协议(例如:http, https, ftp)
host:Http服务器的IP地址或者域名
port:端口号,http默认是80端口
path:访问资源的路径
query-string:发送给http服务器的数据
anchor:锚点#
1.4. url.py的作用
URL配置(URL configuration)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于哪个URL调用哪段代码。url的加载就是从配置文件中开始。
1.5. url的例子
路由url.py:
from django.contrib import admin
from django.urls import path,re_path,include
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index), # 通过index路由,访问同级目录下的视图函数
]
视图函数views.py:
from django.http import HttpResponse
# request参数,用来携带请求
def index(request):
return HttpResponse('欢迎来到Django的世界')
def test(request,name,age):
return HttpResponse(f'你好,我叫{name},今年{age}岁!')
使用pycharm将django服务开启,通过路由查找网页:
只有当你输入的url跟后台配置的url一致,才会调用url对应的视图函数。
2. path和re_path:
2.1. path基本规则:
使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type),没有转化器,将匹配任何字符串,当然也包括了 / 字符。当前面的url匹配成功后,就会调用后面的视图函数。
2.2. 默认支持的转换器
str:匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int:匹配正整数,包含0。
slug:匹配字母、数字以及横杠、下划线组成的字符串。
uuid:匹配格式化的uuid,如075194d3-6885-417e-a8a8-6c931e272f00。
path:匹配任何非空字符串,包含了路径分隔符
2.3. path与转换器例子
路由url.py:
from django.contrib import admin
from django.urls import path,re_path,include
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index), # 通过index路由,访问同级目录下的视图函数
path('test/<name>/<age>/', views.test), # 路由可以随便取,但参数一定要一致即<name>
# 转换器的使用,限定参数类型
# slug:匹配数字、字母、横杠、下划线组成的字符串;int:匹配正整数与0
path('test/<slug:name>/<int:age>/',views.test) #路由可以随便取,但参数一定要一致即<name>,这里有限定参数的类型
]
视图函数views.py:
from django.http import HttpResponse
# request参数,用来携带请求
def index(request):
return HttpResponse('欢迎来到Django的世界')
def test(request,name,age):
return HttpResponse(f'你好,我叫{name},今年{age}岁!')
2.4. re_path正则匹配
re_path('^test/(?P<name>[A-z0-9_]{6,12})/(?P<age>[0-1][0-9]{0,2})/$',views.test),
:路由匹配name参数为26个字母大小写与数字0到9以及下划线,参数设置6到12位,匹配age参数为0或1(必选),0到9参数设置0到2位,匹配成功后即可调用views中的test函数。
2.5. include的使用
一个project有一个总的urls.py,各个app也可以建立自己的urls.py,用include()函数在project的urls.py文件进行注册。
将创建的两个app,添加到主项目中的settings.py文件下的INSTALLED_APPS的列表中,如下的movie和book。
from django.contrib import admin
from django.urls import path,re_path,include
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls')), # 给book app分配一个分路由,访问的是整个文件
path('movie/',include('movie.urls')), # 给movie app分配一个分路由,访问的是整个文件
]
book app的url路由与视图函数如下:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('index/',views.index),
]
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("这是book模块的主页")
movie app的url路由与视图函数如下:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
]
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("这是movie模块的主页")
2.6. kwargs的作用
传递一个Python 字典作为额外的参数传递给视图函数。Kwargs为字典类型,可以传递额外的参数到views中,使用include的时候,需要统一给子路由一些参数的时候,显得尤其有用。
在视图函数中,可以通过关键字参数获取到。
主路由urls.py:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls'),{'flag':'True'}), # 如果需要给app—book的所有分路由一个参数值,那就用字典来传递,既然传递了这个参数值,book的views视图函数就必须要用**kwargs来接收
]
子路由book的urls.py:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('index/',views.index),
path('test/<slug:name>/<int:age>/',views.test),
path('hello/',views.hello),
path('old_book/',views.old_book),
path('new_book/',views.new_book,name='new'),
path('slide/',views.slide),
path('slide/<name>/',views.slide),
]
子路由book的views.py:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
# request参数,用来携带请求
def index(request,**kwargs):
print(kwargs.get('flag'))
return HttpResponse('欢迎来到Django的世界')
def test(request,name,age,**kwargs):
return HttpResponse(f'你好,我叫{name},今年{age}岁!')
def hello(request,**kwargs):
return HttpResponse('Hello book!')
2.7. name的作用(页面重定向)
给一个匹配的url地址取名字,一般用于模板,也可以使用reverse进行页面重定向。
name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不用做任何改动了。
主路由的urls.py:
from django.contrib import admin
from django.urls import path,re_path,include
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls')), # 给book app分配一个子路由,访问的是整个文件
path('movie/',include('movie.urls')),
]
子路由book的urls.py:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('index/',views.index),
path('old_book/',views.old_book),
path('new_book/',views.new_book,name='new'),
]
子路由book的views.py:
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect,reverse # 重定向需导入模块
# Create your views here.
# request参数,用来携带请求
def index(request):
print(kwargs.get('flag'))
return HttpResponse('欢迎来到Django的世界')
def old_book(request):
# redirect是重定向,reverse里面的值和路由文件里新网页的name值保持一致。
return redirect(reverse('new'))
def new_book(request):
return HttpResponse('这是新网址的首页!')
3. 模板路径配置
3.1. 模板放在哪里?
1.在主目录下创建一个templates目录用来存放所有的html的模板文件。
2.templates目录里面在新建各个以app名字命名的目录来存放各个app中模板文件。
3.2. setting.py中的模板路径配置
将存放html模板的templates目录路径添加到settings.py文件中的DIRS中。
4. 模板渲染方式
4.1. 三种方式
- 直接将html字符串硬编码HttpResponse中,非常不推荐;
- 使用django.template.loader来定义函数以加载模板;
- 使用render进行渲染,这种优先选择。
主路由的urls.py:
from django.contrib import admin
from django.urls import path,re_path,include
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include('book.urls')), # 给book app分配一个子路由,访问的是整个文件
path('movie/',include('movie.urls')),
]
子路由book的urls.py:
from django.urls import path
# 从同级目录下导入文件
from . import views
urlpatterns = [
path('index/',views.index),
path('slide/',views.slide),
path('slide/<name>/',views.slide), # 接收有参数的情况
]
子路由book的views.py:
from django.http import HttpResponse
from django.template.loader import get_template # 获取模板文件需导入模块
from django.shortcuts import render # 渲染页面需导入模块
# request参数,用来携带请求
def index(request,**kwargs):
print(kwargs.get('flag'))
return HttpResponse('欢迎来到Django的世界')
# 第一种渲染页面的方式
# 强行在视图函数中返回值处添加,代码量很少可以使用,不过不推荐使用这种。
# # 第二种渲染页面的方式
# # 获取模板文件
# from django.template.loader import get_template # 获取模板
# # 渲染页面
# from django.shortcuts import render
# # 无参数的情况
# def slide(request):
# sli = get_template('book/01_Rotation chart.html') # 获取模板文件
# html = sli.render() # 渲染页面
# return HttpResponse(html) # 响应渲染过后的页面
# # 有参数的情况
# def slide(request,name):
# sli = get_template('book/01_Rotation chart.html') # 获取模板文件
# html = sli.render({'name':name}) # 渲染页面
# return HttpResponse(html) # 响应渲染过后的页面
# 第三种渲染页面的方式(这种优先,非常推荐使用这种方式)
# 无参数的情况
def slide(request):
return render(request,'book/01_Rotation chart.html')
# 有参数的情况
def slide(request,name):
return render(request,'book/01_Rotation chart.html',{'name':name})
文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!
Editor:Lonelyroots