• django 路由层 伪静态网页 虚拟环境 视图层


    路由层

      无名分组

      有名分组

      反向解析

      路由分发

      名称空间

    伪静态网页

    虚拟环境

    视图层

      JsonResponse

      FBV与CBV

      文件上传

    项目urls.py下面

    from app01 import views
    
    urlpatterns = [
    
    url(r'^admin/',admin.site.urls),
    url(r^$',views.home),        #页面首页 正则匹配路由后面没有后缀 计时只有  就是只要点击127.0.0.1:8000直接显示的页面
    url(r'^test/[0-9]{4}',views.test),    #匹配的路由是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)    #有名分组 匹配一个或多个数字 给视图函数year参数传值
    
    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,

     反向解析(根据名字动态获取到对应路径)

    #项目urls下面路由与视图函数的对应关系
    url(r'^test/(d+)/',views.test,name = 'list'),
    url(r^index688755/$',views.index,name='index')
    #可以给每一个路由与视图函数对应关系起一个名字
    #这个名字能够唯一标识出对应的路径
    #注意这个名字不能重复是唯一的
    
    
    #前端使用
    {% url 'index' %}
    {% url  '你给路由与视图函数对应关系起的别名' %}
    
    #后端使用
    from django.urls import reverse
    
    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.endit,name='edit')
    #前端模板语法
    {%for user_obj in user_list%}
        <a href ='edit/{{ user_obj.pk}}/'></a>
    {% endfor %}
    
    #视图函数
    form django.urls 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下面都可以由自己的url.py路由层, templates文件夹,static文件夹
    #项目名下urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发
    
    from django.conf.urls impout url,inclue
    
    #路由分发  注意路由分发总路由千万不要$结尾
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls))
    
    #在应用下新建urls.py 文件,在该文件内部写路由与视图函数的对应关系即可
    form django.conf.urls import url
    from app01 import views
    urlpatterns = [
    rul(r'^index/',views.index)
    ]

    名称空间(了解)

    from django.conf.urls import url,include
    from app01 import urls as app01_urls
    from app02 import urls as app02_urls

    url(r'^app01/',include(app01_urls,namespace='app01')), url(r'^app02/',include(app02_urls,namespace='app02')) #加名称空间是因为app里面起别名都是一样的 反向解析后缀识别不出来 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')

    #第二种
    #项目路由里面只需要写
    url(r'^app01/,include(app01_urls)),

    app01.url.py
    url(r'^index/',views.index,name='app01_index')

    app01.views.py
    reverse('app01_index')

    第三种 项目urls里面不用导入 app里面起别名和视图函数里面反转解析和第二种一样
    项目里直接写
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))

    伪静态网页

    #搜索优化seo
    rul(r'^index.html',views.index,name='app01_index')

    虚拟环境

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

    django 1.0与django 2.0之间的区别

    #django 2.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 注册

    自定义转换器

    from django.urls import path,re_path,register_converter
    from django.shortcuts import HttpResponse
       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_views())
    
    
    from django.views import View
    clas MyCls(Views):
        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')

    JsonResponse

    from django.http import JsonResponse
    
    def index(request):
        #res = {'name':'Jsaon帅逼','password':'123'}
        #return HttpResponse(jason.dumps(res))   #json默认会给中文编码  ensure_ascii=False 就不会编码了
        return JsonRespose({'name':'Jason大帅比','password':'1888888'},json_dumps_params={'ensure_ascii':False})

     默认只能传递字典类型如果要传递非字典类型需要设置一下safe关键字参数

    response = JsonResponse([1, 2, 3], safe=False)

    简单的文件上传

    print('path:',request.path)
    print('full_path:',request.get_full_path())
    
    path:/upload_file/
    full_path:/upload_file/?name=jason

    前端需要注意的点:

      1 method需要指定成post

      2 enctype需要改为multipart/form-data格式

    后端暂时需要注意的是

      1 配置文件中注释掉 'django.middleware.csrf.CsrfViewMiddleware', 中间件

      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)
        
  • 相关阅读:
    递归和消去递归
    Time complexity analysis of algorithms
    algorithms中计算时间的渐近表示
    OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
    javascript实现URL编码与解码
    before伪类的超有用应用技巧——水平菜单竖线分隔符
    在线工具(转)
    程序员小抄大全
    Web设计的速查卡(转)
    一个简单的AJAX示例(转)
  • 原文地址:https://www.cnblogs.com/lakei/p/11000969.html
Copyright © 2020-2023  润新知