Django 的路由系统

Django 的路由系统

路由层

    urlpatterns = [
                url(r'^admin/', admin.site.urls),
                url(r'^$',views.home),
                url(r'^test/$',views.test),
                url(r'^testadd/$',views.testadd),
                url(r'',views.error)
            ]

注意:第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数

网站首页路由

        url(r'^$',views.home)

网站不存在页面

    url(r'',views.error)

无名分组

​ (将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数)

    # 路由    
  url(r'^test/(\d+)/',views.test),  # 匹配一个或多个数字
    # 视图
        def test(request,xxx):
            print(xxx)
            return HttpResponse('test')

有名分组

(将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数)

    # 路由    
  url(r'^test/(?P<year>\d+)/',views.test),  # 匹配一个或多个数字
    # 视图
  def test(request,year):
    print(year)
    return HttpResponse('test')

注意: 无名分组和有名分组不能混着用!!!

    url(r'^test/(\d+)/(?P<year>\d+)/',views.test)  # 不能混着用

但是 支持用一类型多个形式匹配。

    无名分组多个
        url(r'^test/(\d+)/(\d+)/',views.test),
  有名分组多个
        url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),

反向解析

(根据名字动态获取到对应路径)

# 路由
        from django.shortcuts import reverse
        
        url(r'^index6668888/$',views.index,name='index')
        # 可以给每一个路由与视图函数对应关系起一个名字
        # 这个名字能够唯一标识出对应的路径
        # 注意这个名字不能重复是唯一的
    
# 前端使用
        {% url 'index' %}
        {% url '你给路由与视图函数对应关系起的别名' %}
    
# 后端使用
        reverse('index')
        reverse('你给路由与视图函数对应关系起的别名')

无名分组反向解析

# 路由
        url(r'^test/(\d+)/',views.test,name='list')
        
# 后端使用
        print(reverse('list',args=(10,)))
# 前端使用
        {% url 'list' 10 %}
        (10 不是固定的,可以是后端渲染的变量)

示例:

        # 后端传给前端
    user_list = models.User.objects.all()
        # 前端模板语法
            {%for user_obj in user_list%}
                <a href='edit/{{ user_obj.pk }}/'></a>
            {% endfor %}
      
# —————————————————————————————————————————— #       
    # Django路由
        url(r'^edit/(\d+)/',views.edit,name='edit')
        # 后端视图函数
        from django.shortcuts import reverse
        def edit(request,edit_id):
            url = reverse('edit',args=(edit_id,))
            
        # 使用模板为
            {% url 'edit' edit_id %}

有名分组反向解析

后端使用
            # 后端有名分组和无名分组都可以用这种形式
            print(reverse('list',args=(10,)))
            # 下面这个了解即可
            print(reverse('list',kwargs={'year':10}))
前端使用
            # 前端有名分组和无名分组都可以用这种形式
            {% url 'list' 10 %}
            # 下面这个了解即可
            {% url 'list' year=10 %}
总结:针对有名分组与无名分组的反向解析统一采用一种格式即可
后端
        reverse('list',args=(10,))  # 这里的数字通常都是数据的主键值
前端
        {% url 'list' 10 %}
反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

路由分发

​ django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹

​ 项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发

  from django.conf.urls import include
    
    # 路由分发  注意路由分发总路由千万不要$结尾
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls))
    
    # 在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可
    from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url(r'^index/',views.index)
    ]

名称空间(了解)

        url(r'^app01/',include(app01_urls,namespace='app01')),
        url(r'^app02/',include(app02_urls,namespace='app02'))
    app01.urls.py
        from django.conf.urls import url
        from app01 import views
        urlpatterns = [
            url(r'^index/',views.index,name='index')
        ]

    app02.urls.py
        from django.conf.urls import url
        from app02 import views
        urlpatterns = [
            url(r'^index/',views.index,name='index')
        ]
    
    app01.views.py
    reverse('app01:index')
    
    app02.views.py
    reverse('app02:index')

伪静态网页

​ 搜索优化seo

        url(r'^index.html',views.index,name='app01_index')

虚拟环境

        不同的项目配置不同的python解释器
    
    django1.0与django2.0之间的区别
        django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配
        
        django2.0里面的re_path对应着django1.0里面的url
        
    虽然django2.0里面的path不支持正则表达式,但是它提供五个默认的转换器
    
        str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
        int,匹配正整数,包含0。
        slug,匹配字母、数字以及横杠、下划线组成的字符串。
        uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
        path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转换器

        1.正则表达式
        2.类
        3.注册
    
    # 自定义转换器
    class FourDigitYearConverter:
        regex = '[0-9]{4}'
        def to_python(self, value):
            return int(value)
        def to_url(self, value):
            return '%04d' % value  # 占四位,不够用0填满,超了则就按超了的位数来!
    register_converter(FourDigitYearConverter, 'yyyy')
    PS:路由匹配到的数据默认都是字符串形式

FBV与CBV

FBV:基于函数的视图

CBV:基于类的视图

    CBV:
        url(r'^mycls/',views.MyCls.as_view())
    
        class MyCls(View):
            def get(self,request):
                return render(request,'index.html')
            def post(self,request):
                return HttpResponse('post')
    
    无论是FBV还是CBV路由层都是路由对应视图函数内存地址
    urlpatterns = [
        # url(r'^mycls/',views.view)
        url(r'^mycls/',views.MyCls.as_view())
    ]
    
    class MyCls(View):
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            return HttpResponse('post')

小白必会三板斧

HttpResponse

render

redirect

JsonResponse

from django.http import JsonResponse
    def index(request):
        # res = {'name':'Jason大帅比','password':18}
        # return HttpResponse(json.dumps(res))
        return JsonResponse({'name':'Jason大帅比','password':'1888888'},json_dumps_params={'ensure_ascii':False})

简单的文件上传


    前端需要注意的点:
        1.method需要指定成post
        2.enctype需要改为formdata格式
    
    后端暂时需要注意的是
        1.配置文件中注释掉csrfmiddleware中间件
        2.通过request.FILES获取用户上传的post文件数据
        
# 后端文件保存
    file_obj = request.FILES.get('my_file')
        print(file_obj.name)
        with open(file_obj.name,'wb') as f:
            for line in file_obj.chunks():
                f.write(line)

转载于:https://www.cnblogs.com/tyler-bog/p/10999813.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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的定制化处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值