6.Django(路由分发,主页跳转)

路由分发

  • 补充知识点

    • 是否开启URL访问地址后/跳转至带有/的路劲的配置项

      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>

 

posted @ 2020-05-19 10:43  牧羊小董  阅读(660)  评论(0)    收藏  举报