Django 路由层 虚拟环境下建项目

2023-05-16

路由匹配规律

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

 

    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'^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),


反向解析

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

如果需要改很多视图函数的名字时,url也要一个一个改,太麻烦了,反向解析就是解决这个问题的
        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 %}
        
        user_list = models.User.objects.all()
       

   url(r'^edit/(\d+)/',views.edit,name='edit')
        前端模板语法
            {%for user_obj in user_list%}
                <a href='edit/{{ user_obj.pk }}/'></a>
            {% endfor %}
        
        视图函数
        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的问题,可以用as取别名,也可以直接app001.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')

  (就是在后面加上.html)

 

虚拟环境

  不同的项目配置不同的python解释器

安装 file/newproject


    


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')

    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')  

 

 无论是FBV还是CBV路由层都是路由对应视图函数内存地址

 


JsonResponse


 from django.http import JsonResponse
    def index(request):
        # res = {'name':'铁柱','password':38}
        # return HttpResponse(json.dumps(res))
        return JsonResponse({'name':'铁柱','password':'38'},json_dumps_params={'ensure_ascii':False})  

 

用json.dumps()时默认会将汉字转成二进制,ensure_ascii=True,需要把这个参数改为False
    

使用JsonResponse时则是需要加:json_dumps_params={'ensure_ascii':False}
    print('path:',request.path)
    print('full_path:',request.get_full_path())
    
    path: /upload_file/
    full_path: /upload_file/?name=jason


    简单的文件上传


def upload_file(request):
    if request.method == 'POST':
        print('path:',request.path)
        print('full_path:',request.get_full_path())
        # print(request.FILES)
        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)
        return HttpResponse('OK')
    return render(request,'index.html')  

    前端需要注意的点:
        1.method需要指定成post
        2.enctype需要改为formdata格式
    后端暂时需要注意的是
        1.配置文件中注释掉csrfmiddleware中间件
        2.通过request.FILES获取用户上传的post文件数据
 
        
        
        
        
        
        
        

转载于:https://www.cnblogs.com/tuanzibuku/p/11000884.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 路由层 虚拟环境下建项目 的相关文章

随机推荐

  • 163music 反爬分析

    网易163 音乐的 mp3下载 view source https music 163 com playlist id 61 924680166 这个是网页源代码 链接 中间的 拿不到具体的数据 所以获取页面的时候 要去除 http mus
  • 二层链路聚合实验

    交换机1 xff1a ystem view vlan 10 vlan 20 qu interface range g1 0 1 to g1 0 2 port link type access port access vlan 10 qu i
  • plsql

    1 添加快捷键设置 摘抄自https www cnblogs com guangxiang p 9487132 html 汉化版 xff1a 工具 首选项 用户界面 编辑器 自动替换 定义文件 英文版 xff1a Tools gt Perf
  • 如何利用python制作微信好友头像照片墙?

    这个不难 xff0c 主要用到itchat和pillow这2个库 xff0c 其中itchat用于获取微信好友头像照片 xff0c pillow用于拼接头像生成一个照片墙 xff0c 下面我简单介绍一下实现过程 xff0c 代码量不多 xf
  • 软件需求工程与UML建模第二周工作总结

    项目范围 xff1a 1 能够实现仅弹道技能的躲避训练和带有技能发射主体的技能躲避训练 2 要能够玩家自由选择角色进行训练 3 要能够实现包含技能躲避 1v1对线训练等多模式选择的训练方式 4 要能够快捷进行多次练习 xff0c 我们计划加
  • 阻塞和非阻塞~

    很清楚 先记下 https www zhihu com question 19732473 answer 14413599 转载于 https www cnblogs com Mickey697 p 10863679 html
  • vnc利用ps命令查看所有DISPLAY

    ps aux grep vnc 使用该命令可以看到详细的vnc进程和使用的DISPLAY和DISPLAY的分辨率
  • 基础数据类型的补充,编码的进阶,基础数据类型之间的转换

    1 内容总览 基础数据类型的补充数据类型之间的转换 其他数据类型转成bool值为False的情况编码的进阶 2 具体内容 数据类型的补充 str 6个 code str xff1a 补充的方法练习一遍就行 6个 s1 61 39 taiBA
  • Keepalived

    Keepalived双机热备 Keepalived简介 Keepalived是使用C语言编写的路由热备软件 xff0c 该项目软件的主要目标是为Linux系统提供简单高效的负载均衡及高可用解决方案 负载均衡架构依赖于知名的IPVS xff0
  • Scyther 形式化分析工具资料整理(三)

    1 作者Cas Cremers在做TLS1 3的时候我么发现并没有使用Scyther 形式化丰分析工具对其进行分析 xff0c 而是使用了 The Tamarin 作者建立了TLS 13的模型 那么我的目标是 使用Scyther工具对TLS
  • java产生随机数的三种方式

    public class Test public static void main String args Random类 创建随机数对象有2种 一种是添加参数 也叫种子 这种方式创建出来的数 刷新后不会改变 相当于常量了 主要方法 nex
  • gcc 编译两个so其中soA依赖soB

    有两个so xff0c 其中soB中调用soA xff1b 那么我们打包soB的时候连接soA xff1b 在打包test程序的时候连接soB 此时soB会自动查找依赖的soA xff1b 如下测试 在编译之前指定环境变量 xff1a ex
  • Vue 循环 [Vue warn]: Avoid using non-primitive value as key

    页面中不添加 xff1a key 索引的时候 xff0c 会不停的提示虚线 xff0c 但不影响使用 后来加了一个索引 xff0c 加成了 key 61 34 content 34 从后台取出来的contents是一个list xff0c
  • 博客系统 01 登录退出

    一 工程搭建 使用的是IDEA xff08 1 xff09 新建个动态web工程 xff08 Blog xff09 xff08 2 xff09 导入jar包 xff08 SSH jar包 xff09 xff08 3 xff09 导入配置文件
  • 蓝桥杯2017国赛JAVAB组 树形显示 题解

    标题 xff1a 树形显示 对于分类结构可以用树形来形象地表示 比如 xff1a 文件系统就是典型的例子 树中的结点具有父子关系 我们在显示的时候 xff0c 把子项向右缩进 xff08 用空格 xff0c 不是tab xff09 xff0
  • 读《【解密】京东B2B业务架构演变》有感

    京东的B2B业务目前来说发展比较好 xff0c 它的定位是让各类型的企业都可以在京东的 B 平台上进行采购 建立采购关系 京东 B2B 的用户群体主要分为 2 类 xff0c 一类是大 B 用户 另一类是小 B 用户 比如联通 移动公司跟京
  • python中线程、进程和协程的区别

    进程是资源分配的单位线程是操作系统调度的单位协程 xff0c 又称微线程 xff0c 纤程 xff0c 协程的切换只是单纯的操作CPU的上下文 xff0c 资源很小 xff0c 效率高进程切换需要的资源很最大 xff0c 效率很低一个程序至
  • linux下常用alias

    alias xx 61 39 39 其中 61 两边不要有空格
  • C#常用控件(2)

    1 Botton 控件 按钮用图片应该设置内阁为Image xff0c 而不能设置Background为Image xff0c 如果只设置背景 xff0c 按钮鼠标经过样式还在 XAML写法 C 写法 2 Combobox 控件 下拉框控件
  • Django 路由层 虚拟环境下建项目

    路由匹配规律 第一个参数是正则表达式 xff0c 匹配规则按照从上往下一次匹配 xff0c 匹配到一个之后立即匹配 xff0c 直接执行对应的视图函数 urlpatterns 61 url r 39 admin 39 admin site