05、视图和响应-- 发送请求的主要方式 和 动态路由 url匹配

1、新建项目

--基本命令参考
    --django-admin startproject bookmanager02
    --python manage.py startapp book
    --配置settings.py
    --配置model
    --配置子应用中 __init__.py
        import pymysql

        pymysql.install_as_MySQLdb()

from django.db import models

# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=20, verbose_name='名称')
    pub_date = models.DateField(verbose_name='发布日期',null=True)
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'bookinfo'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.name

# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'

    def __str__(self):
        return self.name
--python manage.py makemigrations  生成迁移文件
--python manage.py migrate  迁移数据库

--进入数据库插入数据

insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
insert into peopleinfo(name, gender, book_id, description, is_delete)  values
    ('郭靖', 1, 1, '降龙十八掌', 0),
    ('黄蓉', 0, 1, '打狗棍法', 0),
    ('黄药师', 1, 1, '弹指神通', 0),
    ('欧阳锋', 1, 1, '蛤蟆功', 0),
    ('梅超风', 0, 1, '九阴白骨爪', 0),
    ('乔峰', 1, 2, '降龙十八掌', 0),
    ('段誉', 1, 2, '六脉神剑', 0),
    ('虚竹', 1, 2, '天山六阳掌', 0),
    ('王语嫣', 0, 2, '神仙姐姐', 0),
    ('令狐冲', 1, 3, '独孤九剑', 0),
    ('任盈盈', 0, 3, '弹琴', 0),
    ('岳不群', 1, 3, '华山剑法', 0),
    ('东方不败', 0, 3, '葵花宝典', 0),
    ('胡斐', 1, 4, '胡家刀法', 0),
    ('苗若兰', 0, 4, '黄衣', 0),
    ('程灵素', 0, 4, '医术', 0),
    ('袁紫衣', 0, 4, '六合拳', 0);

2、ALLOWED_HOSTS

--ALLOWED_HOSTS = ['*']  在settings.py文件中设置 ALLOWED_HOSTS = ['*'],所有ip都可以访问

3、url 配置中 name参数的使用  reverse(viewname)  --  动态路由 

--urls.py 中 urlpatters 列表中,每一个
    url(r'^index/$', index, name='adan')  # 不仅加上 pattern、view,还可以加上 name=''

--name 属性的意义和作用:
    再公司项目变动的过程中,会出现变动url的情况,此时如果直接改变 pattern [第一个参数] 会导致,很多地方发生变动。如果事先使用的是 name 别名则不会出现这种情况


--举例:
    --下面例子中,举例2种情况下直接修改url会有诸多不便,因此使用name较为方便:
    from django.http import HttpResponse
    from django.shortcuts import render, redirect


    def index(request):
        # 登录之后跳转到 index
        return redirect('/index/')

        # 注册之后也要跳转到 index
        return redirect('/index/')

        # 返回值
        return HttpResponse("Sunck is a good man")

    --使用 name 替代 url 举例如下:
    from django.http import HttpResponse
    from django.shortcuts import render, redirect
    from django.urls import reverse


    def index(request):
        """
        --urls.py 文件中 url配置了 name=goudan,其使用 reverse() 函数通过 name 取出url进行使用
            from django.conf.urls import url
            from book.views import index


            urlpatterns = [
                url(r'^index/$', index, name='goudan')
            ]            
        """
        # 通过配置好的 name 去除url进行访问,使用动态路由
        url_path = reverse('goudan')
        print(url_path)

        # 返回值
        return HttpResponse("Sunck is a good man")    
--reverse 进一步使用:
    --刚才只是 在子应用urls.py文件中的 urlpattrens列表中加上 name 属性
    --接下来在 总应用的 urls.py 文件中的 include() 里面配置 namespace参数,记得配两次,示例如下:
        --namespace 参数和子应用名称保持一致
    
    --总应用urls:
        from django.conf.urls import url
        from django.contrib import admin
        from django.urls import path, include

        urlpatterns = [
            path('admin/', admin.site.urls),
            url(r'^', include(('book.urls', 'book'), namespace='book')),
        ]
    --子应用urls:
        from django.conf.urls import url
        from book.views import index


        urlpatterns = [
            url(r'^index/$', index, name='goudan')
        ]

    --视图中 使用 reverse 函数:
        def index(request):
            # 通过配置好的 name 去除url进行访问
            url_path = reverse('book:goudan')
            print(url_path)

            # 返回值
            return HttpResponse("Sunck is a good man")

4、postman 测试工具

5、四种传递信息的方式

--在 url地址 中传递参数:
    --/weather/beijing/2018  就可以传递 年月日 地区 等信息

--查询字符串(query string)形式,http://ip:port?key=value
    --https://list.jd.com/list.html?cat=15248,15249,15276

--请求体(body)中发送的数据,比如表单 json xml等格式

--http的报文头 headers 传递数据
--url 中 使用正则匹配访问资源地址:位置参数
    --示例:在 url地址 中传递参数:记住对于 re 正则分组匹配的 url,会变成参数传递出去
        urlpatterns = [
            url(r'^index/$', index, name='goudan'),
            url(r'^(1)/(100)/', details)
        ]

        # url 提取
        def details(request, cat_id, book_id):
            # 打印传递的参数
            print(cat_id, book_id)

            return HttpResponse('get utl details')

        urlpatterns = [
            url(r'^index/$', index, name='goudan'),
            url(r'^(\d)/(\d{2,3})/', details)  # \d 表示数字,{2,3} 记住不要有空格,表示数字的个数
            url(r'^([q|w|e|r])/(\d{2,3})/', details)
            url(r'^([q|w|e|r]{0,4})/(\d{2,3})/', details)  
            url(r'^(write_name_[q|w|e|r]{0,4})_latin_font/(\d{2,3})/', details)  # 示例 http://10.1.1.171:8000/write_name_werw_latin_font/10/
        ]

--url 中 使用正则匹配访问资源地址: 但是会出现 /value02/value01/ 顺序搞反的情况出现,因此出现另一种关键字参数匹配方式:关键字参数
    --格式如下:
        应用中urls.py
            其中?P<value1>部分表示为这个参数定义的名称为value1
            可以是其它名称,起名要做到见名知意
            --url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),

        视图中函数: 参数的位置可以变,跟关键字保持一致即可
            def index(request, value2, value1):
                # 构造上下文
                context = {'v1':value1, 'v2':value2}
                return render(request, 'Book/index.html', context)

    --示例代码:
        urlpatterns = [
            url(r'^index/$', index, name='goudan'),
            url(r'^(?P<book_id>[q|w|e|t]{0,5})/(?P<cat_id>\d{0,4})/', details)  # P大写
        ]

        # url 提取
        def details(request, cat_id, book_id):
            # 打印传递的参数
            print(cat_id, book_id)

            return HttpResponse('get utl details')
--url 中使用 关键字 + 正则匹配的方式访问资源地址
    --示例:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Django中,路由(routing)是指将URL(统一资源定位符)映射到相应的视图函数或类的过程。Django使用URLconf(URL配置)来配置路由。 URLconf是一个Python模块,它定义了URL模式和对应的处理函数或类。Django通过匹配URL模式来确定应该调用哪个处理函数或类来处理请求。下面是一些关于Django路由的详细解释: 1. 根URLconf:每个Django项目都有一个根URLconf,它负责处理项目的根URL。这个根URLconf通常是项目目录中的urls.py文件,它定义了项目的顶级URL模式。 2. URL模式:URL模式是一个正则表达式(或字符串),用于匹配请求URL。它可以包含变量和其他特殊字符来提取URL中的参数。URL模式在根URLconf和应用程序的URLconf中定义。 3. 处理函数或类:当URL模式与请求URL匹配时,将调用相应的处理函数或类来处理请求。处理函数可以是常规的Python函数,也可以是基于类的视图。处理函数或类负责处理请求并返回响应。 4. 命名URL:Django允许为每个URL模式分配一个唯一的名称。这样可以使得在代码中引用URL更加方便和可维护。命名URL可以通过名称反向解析为对应的URL。 5. 包含(include):Django的路由系统支持将URL模式划分为不同的模块。可以使用include函数将其他URLconf包含到主URLconf中,实现路由的分发和管理。 6. 参数传递:URL模式可以包含变量,这些变量可以从URL中提取出来,并作为参数传递给处理函数或类。这样可以实现动态的URL匹配和处理。 7. URL分发和重定向:Django允许将请求分发到不同的处理函数或类,并支持URL重定向。这样可以实现将请求从一个URL转发到另一个URL。 总的来说,Django的路由系统提供了灵活和强大的功能,可以帮助开发者管理项目中的URL,并将请求分发到适当的处理函数或类。通过定义URL模式和处理函数或类,可以实现对不同URL的定制化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值