• Django 路由


    Django 路由

    image

    每个应用(app)都可以有自己的templates来存放HTML文件,查找顺序是通过app注册的顺序来查找的;

    路由分发

    django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在总的urls.py很明显太冗余不便于管理;

    其实django中的每一个应用都可以有自己的urls.py,static文件夹,templates文件夹,基于上述特点,使用django做分组开发非常的简便;

    这里的路由分发,类似项目下urls.py是总路由,应用下的urls.py是子路由,这样各司其职,先通过总路由筛选要找的应用,在通过应用的子路由查询对应关系及其对应的视图函数,渲染出不同的页面···

    '''总路由分发'''
    # 方式一
    from django.contrib import admin
    from django.urls import path,re_path,include
    from app01 import urls as app01_urls
    from app02 import urls as app02_urls
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        # 路由分发
        re_path('^app01/',include(app01_urls)),
        re_path('^app02/',include(app02_urls))
    ]
    '''app01 urls.py'''
    from django.urls import path,re_path
    from app01 import views
    
    urlpatterns = [
        re_path(r'^index/',views.index)
    ]
    '''app01 views.py'''
    def index(request):
        return HttpResponse('from app01 index')
    '''app02和app01一样'''
    
    # 方式二:不需要导入模块,直接点
    re_path('^app01/',include('app01.urls')),
        re_path('^app02/',include('app02.urls'))
    

    名称空间

    名称空间的存在解决了,当多个应用在反向解析使用相同别名的时候,出现了无法自动识别情况

    总路由

    urlpatterns = [
        path('admin/', admin.site.urls),   # 路由分发  
        path('app01/',include(('app01.urls','app01'),namespace='app01')),    
        path('app02/',include(('app02.urls','app02'),namespace='app02'))
    ]
    
    

    PS:注意,在使用名称空间的时候,include函数需要传递两个参数,arg和namespace, 当namespace不为空时,arg参数必须是一个二元组,除了urlpatterns不能为空之外,app_name也必须填写

    应用

    '''app01 urls.py'''
    from django.urls import path, re_path
    from app01 import views
    app_name = 'app01'  # 一定要声明应用名
    urlpatterns = [
        re_path(r'^index/',views.index,name='index'),
        re_path(r'^login/',views.login),
    ]
    '''app01 views.py'''
    from django.shortcuts import HttpResponse, reverse,render
    def index(request):
        return HttpResponse('from app01 index')
    def login(request):
        print(reverse('app01:index'))
        # return HttpResponse('from app01 login')
        return render(request,'home.html')
    
    <h1>HOME</h1>
    <a href="{% url 'app01:index' %}">app01</a>
    <a href="{% url 'app02:index' %}">app02</a>
    

    伪静态

    动态网页“伪装”成静态网页,在url中将地址模拟成.html结尾的样子,看上去像似一个静态文件,目的是为了增加搜索引擎收藏我们网站的概率以及SEO查询几率;

    image

    本地虚拟环境

    在时间开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什么,用不到的一概不装,不同的项目解释器环境都不一样;

    一般项目都会将项目依赖写入requirements.txt,然后使用pip install -r requirements.txt一次性安装依赖

    image

    ps:创建虚拟环境类似于你重新下载了一个纯净的python解释器,如果反复创建类似于反复下载,会消耗一定的硬盘空间

    image

    Django版本区别

    1.区别
        urls.py中的路由匹配方法
            django 1.X第一个参数正则表达式
                url()
            django 2.X和3.X第一个参数不支持正则表达式,写什么就匹配什么
                path()
        如果想要使用正则,那么2.X与3.X也有响应的方法
             from django.urls import path,re_path
            re_path 等价于 1.X里面的url方法
     
    2.转换器
    	五种常用转换器:
        str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
        int,匹配正整数,包含0。
        slug,匹配字母、数字以及横杠、下划线组成的字符串。
        uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
        path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
     
    
    '''总路由'''
    path('app01/',include(('app01.urls','app01'),namespace='app01'))
    '''子路由'''
    path('home/<int:id>',views.home)
    '''视图函数'''
    def home(request,id):
        return HttpResponse('from app01 home')
    

    ps:django1.x拿到的数据都是str,这里的转换器可以将数据类型自动转换;

    自定义转换器

    class MonthConverter:
            regex='\d{2}' # 属性名必须为regex
    
            def to_python(self, value):
                return int(value)
    
            def to_url(self, value):
                return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
    '''使用自定义转换器'''        
        from django.urls import path,register_converter
        from app01.path_converts import MonthConverter
    
        register_converter(MonthConverter,'mon')
    
        from app01 import views
    
    
        urlpatterns = [
            path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),
    
      ]
    

    JsonResponse

    前后端数据交互,数据格式要求为json格式数据,这里提供了JsonResponse来转换

    json模块序列化

    def func(request):
        dic_json = {'name':'Hammer泽','age':18}
        import json
        res = json.dumps(dic_json,ensure_ascii=False)
        return HttpResponse(res)
    

    image

    psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示

    JsonResponse模块

    JsonResponse底层还是json

    def func(request):
        dic_json = {'name':'Hammer泽','age':18}
    	from django.http import JsonResponse
        return JsonResponse(dic_json,json_dumps_params={'ensure_ascii':False})
    

    psensure_ascii=False取消中文自动转码(Unicode),使中文正常显示,JsonResponse模块取消转码,需要添加参数json_dumps_params={'ensure_ascii':False}

    非字典类型序列化需要添加参数

    def func(request):
        lit_json = [1,2,3,4]
        from django.http import JsonResponse
        return JsonResponse(lit_json,json_dumps_params={'ensure_ascii':False},safe=False)
        
    

    注意:多看源码

    上传文件

    上传文件注意html页面,form元素的属性需要设置method="post"enctype="multipart/form-data"

    # 模拟上传文件
    <form action="" enctype="multipart/form-data"  method="post">
        上传文件:<input type="file" name="myfile">
        <input type="submit" class="btn  btn-info">
    </form>
    
    '''路由'''
    path('func1/',views.func1)
    '''视图函数'''
    def func1(request):
        if  request.method=='POST':
            file_obj = request.FILES.get('myfile')   # 获取到文件对象
            print(file_obj.name)   # 获取文件的名字
            with open(file_obj.name,'wb') as f:
                for line in file_obj:
                    f.write(line)
    
        return render(request,'home.html')
    
    '''视图函数使用chunks,相当于迭代器提升效率'''
    def func1(request):
        if  request.method=='POST':
            file_obj = request.FILES.get('myfile')   # 获取到文件对象
            print(file_obj.name)   # 获取文件的名字
            with open(file_obj.name,'wb') as f:
                for chunks in file_obj.chunks():
                    f.write(chunks)
    
        return render(request,'home.html')
    
  • 相关阅读:
    VMware 配置记录
    crond与at任务调度
    springboot校园失物招领网站系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
    Kettle工具使用小结1
    爬虫学习(15):selenium自动化测试(四):截屏、弹出框和下拉框
    大数据和数据要素有什么关系?
    SpringMVC进阶:常用注解、参数传递和请求响应以及页面跳转
    Windows 10下安装labelImg标注工具!
    http状态,cookie、session、token的对比
    Ambari安装部署—基础软件环境说明
  • 原文地址:https://www.cnblogs.com/48xz/p/15947661.html