6.Django(路由分发,主页跳转)
-
补充知识点
-
APPEND_SLASH = True
是开启URL访问地址后/跳转至带有/的路劲的配置项
Django默认是开启这个配置的 -
url匹配的位置
url统一资源定位符:http协议、ip地址、端口、路径、查询条件
url只是匹配路径,前面http协议、IP地址、端口 Django内部已经给你进行筛选了,路径后面的查询条件不作为匹配内容。
url(r'^books/$',views.books),
127.0.0.1:8000/books/
www.taibaijinxing.com/books/
127.0.0.1:8000/books/?page=18引深一下,无论你是get请求还是post请求或者其他(head、option、delete等等)请求,只要是路径正确,就执行对应的views函数。
-
捕获的参数永远都是字符串
url(r'^books/(\d{4})/$', views.books_year),
def books_year(request, year):
print(f'-------> {type(year)}')
return HttpResponse(f'出版的年份{year}')
捕获的参数year为str类型 -
views函数可以设置默认参数
url(r'^books_page/$', views.books_page),
url(r'^books_page/(\d{1,4})/$', views.books_page),
def books_page(request, num='1'):
return HttpResponse('默认⻚数为1' if num == '1' elsef'指定⻚数为{num}') -
通过uels可以给views主动传参(了解)
我想给对应的views函数传递参数,但是我又不想通过无名分组或者有名分组。
url(r'^books_page/$', views.books_page, {'name': 'barry'}),
def books_page(request, name):
return HttpResponse(f'名字为:{name}')
-
-
需求分析
我们的项目不只是一个应用,可能还有其他应用,那么我们一个项目的url路由分发,如何映射到不同的应用里面的views函数呢?
-
创建一个新的项目 urllist
-
创建第二个应用
pycharm不能帮你创建第二个应用,只能通过命令创建第二个应用
python manage.py startapp cost
通过命令创建的第二个应用,我们必须手动配置一下,将此应用配置到整个项目中。
1、在cost应用的apps.py文件中创建一个这样的类:
from django.apps import AppConfig
class CostConfig(AppConfig):
name = 'cost'
2、在整个项目的settings文件中,做如下配置:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tmall.apps.TmallConfig',
'cost.apps.CostConfig', # 添加这一行
# 也可以简写:'cost',
] -
整个项目的url分发到不同应用中
我们现在只有项目中有urls.py文件,我们要将不同的路径映射到不同的应用的views函数中
-
解决方式1:起别名
这样虽然能解决,但是不合理,不方便。我们应该将项目的url作为中转枢纽,访问tmall应用的所有路径映射到tmall应用中,访问cost的应用的所有路径映射到cost应用中。
-
解决方式2:
1、在不同的应用里面分别创建urls.py文件
2、在整个项目的urls.py 引入 include做路由分发
from django.conf.urls import url,include
整个项目的urls做了一个中转引流的作用,所有的
127.0.0.1:8000/tmall......... 这样的路径都引流到tmall应⽤
urls⽂件⾥⾯。
127.0.0.1:8000/cost......... 这样的路径都引流到cost应⽤的urls ⽂件⾥⾯。
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^tmall/',include('tmall.urls')), # 127.0.0.1:8000/tmall/index/ url(r'^cost/',include('cost.urls')), # 127.0.0.1:8000/cost/index/ ]
3、分别构建不同应用的urls
tmall urls: from django.conf.urls import url,include from django.contrib import admin from . import views urlpatterns = [ url(r'^index/',views.index) ] cost urls: from django.conf.urls import url,include from django.contrib import admin from . import views urlpatterns = [ url(r'^index/',views.index) ]
4、分别构建不同的views函数
tmall views: from django.shortcuts import render # Create your views here. def index(request): return render(request, 'tmallindex.html') cost views: from django.shortcuts import render # Create your views here. def index(request): return render(request, 'costindex.html')
5、分别创建不同的html文件
tmall: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>天猫</title> </head> <body> <h1>欢迎来到:天猫</h1> </body> </html> cost: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>聚划算</title> </head> <body> <h1>欢迎来到:聚划算</h1> </body> </html>
6、运行:
天猫: 127.0.0.1:8000/tmall/index/ 聚划算: http://127.0.0.1:8000/cost/index/
-
-
主页跳转
我们将tmall以及cost作为一个淘宝项目的两个应用开展的,在路径上应该有所显示:
访问127.0.0.1:8000/tmall(www.taobao.com/tmall) 直接就可以访问天猫⾸⻚。
访问127.0.0.1:8000/cost(www.taobao.com/cost) 直接就可以访问聚划算⾸⻚
我们要设置一个淘宝的首页,可以通过淘宝的首页跳转到不同的应用首页
前两个需求只要在对应的应用的url里面更改: urlpatterns = [ # index/ url(r'', views.index), ]
我们要设置淘宝首页,淘宝首页应该是整个项目的首页,由于整个项目的没有views函数以及对应的功能,所以我们要借助于一个应用搭建我们的整个项目的首页。我们就借助于tmall去实现功能。
1、更改整个项目的url
from django.conf.urls import url,include from django.contrib import admin from tmall import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^$', views.home), # 增加这行 url(r'^tmall/', include('tmall.urls')), url(r'^cost/', include('cost.urls')), ]
2、在tamll的views函数中创建home函数
def home(request): return render(request, 'home.html')
3、创建对应的html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>欢迎来到 淘宝 首页</h1> <a href="/tmall/">天猫</a> <a href="/cost/">聚划算</a> </body> </html>