• python 学习第二十一天,django知识(三)


    一,django的url路由系统总结

      1,url(/index/,函数或者类)

      2,url(/index/(d+), 函数或者类)

      3,url(/index/(?P<nid>d+),函数或者类)

      4,url(/index/(?P<nid>d+),name="root",函数或者类)

        (1) 在views.py文件中通过reverse()反转url

        (2) 在templates中的文件中引用{% url 'root' 1 %}

         5,url(/crm/,include('app01.urls')进行路由分发

       6,默认值url(/index/,{'web':'root'},函数或者类)

        在views.py中定义函数 def  func(reqeust,web):return ...来接收web这个参数

        7,命名空间

       (1)project.urls.py   

    from djanogo.conf.urls import url,include
    
    urlpatterns = [
         url(r'^a/',include('app01.urls',namespace='author-polls')),
         url(r'^b/',include('app01.urls',namespace='publisher-polls')),
    ]
    

        (2)app01.urls.py 

    from django。conf.urls import url
    from app01 import views
    
    
    app_name = 'app01'
    urlpatterns = [
        url(r'^(?P<pk>d+/$',views.detail,name='detail')
    ]
    

       (3)app01.views.py

    def detail(request,pk):
        print(request.resolver_match)
        return HttpResponse(pk)
    

     以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

      v = reverse('author-polls:detail',kwargs={'pk':11})

      {% url 'app01:detail' pk=12 pp=99 %}

     django 中的路由系统和其它语言的框架有所不同,在django中每个请求的url都要有一条路由映射,这样才能将请求交给对应的view中的函数去处理.其它大部分的WEB框架则是对一类的url请求做一条路由映射,从而使路由系统变得简洁

    二,django的路由请求周期知识点

      (1)Form 表单提交,页面肯定刷新,整个流程为,提交form 表单,发送数据到到后台进行处理,然后等待后台处理完成返回数据,并跳转到其它页面

            用户提交请求到url.py文件中的url,url接收到请求后,匹配到后端的视图函数,并将数据发送到后端,后端将请求处理完成之后,或者直接返回字符串给用户(HttpRespose),或者通过render方法中的open函数打开相应的templates中的html文件,将其中的所有的变量进行替换,最终将html文件和数据都已字符串的形式发送给用户,或者用redirect('/index/')将另外一个请求已字符串的形式发送给用户,用户跳转到其它页面

         (2)ajax 提交

      $.ajax({
    
          url:'/index/';
          data:{'k':'v','list':[1,2,3,4]};          #或者$(form对象).serilize() 已列表的形式获取整个form中的数据
                    type:'POST';                        #向后台提交数据的方式
                    dataType:'JSON';                    #以json形式向后台提交数据
                    traditional:true;                   #需要向后台发送列表时,必须以加这个参数
                    success: function(d) {              #d 为形式参数,可以任意定义
                location.reload() #刷新整个页面
                location.href() #跳转到其它页面 } })

     三,django views知识点

      (1)views中的请求方法

    def func(request):
         request.POST
         request.GET
         request.FILES
         request.getlist
         request.method
         request.path_info           #获取当前的请求的url
    

         (2)request.environ 封装了用户所有的请求头部信息

    from django.core.handlers.wsgi import WSGIRequest
        request.environ
        request.environ['HTTP_USER_AGENT']
    

     四,模板的继承

      1,在主模板中定义block {%  block title %}{% endblock %}

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{% block title %} {% endblock %}</title>
        <link rel="stylesheet" href="/static/commons.css" />
        <style>
            .pg-header{
                height: 50px;
                background-color: seashell;
                color: green;
            }
        </style>
        {% block css %} {% endblock %}
    </head>
    <body>
        <div class="pg-header">小男孩管理</div>
        <div>
            <a>asdf</a>
            <a id="">asdf</a>
            <a>asdf</a>
            <a>asdf</a>
            <a>asdf</a>
        </div>
        <iframe src="/"></iframe>
    </body>
    </html>
    

       2,在子模板中引用block,一个html 只能继承一个模板,但可以有多个include

    {% extends 'master.html' %}
    {% block title %}用户管理{% endblock %}
    {% block content %}
        <h1>用户管理</h1>
        <ul>
            {% for i in u %}
                <li>{{ i }}</li>
            {% endfor %}
        </ul>
    
        {% for i in u %}
            {% include 'tag.html' %}
        {% endfor %}
    
    {% endblock %}
    
    {% block css %}
        <style>
            body{
                background-color: red;
            }
        </style>
    {% endblock %}
    
    {% block js %}
        <script></script>
    {% endblock %}
    

       3,模板中的自定义simple_tag

      (1)在app 中创建templatetags模板,且目录名称必须为这个名字

      (2)创建任意.py文件,如:xx.py

    #!/usr/bin/env python
    #coding:utf-8
    from django import template
    from django.utils.safestring import mark_safe
       
    register = template.Library()
       
    @register.simple_tag
    def my_simple_time(v1,v2,v3):
        return  v1 + v2 + v3
       
    @register.simple_tag
    def my_input(id,arg):
        result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
        return mark_safe(result)
    

      (3)在使用自定义simple_tag的html文件中导入之前创建的xx.py文件名

    {% load xx %}
    

      (4)使用simple_tag

    {% my_simple_time 1 2 3%}
    {% my_input 'id_username' 'hide'%}
    

     (5)在settings中配置当前的app,不然django无法找到自定义的simple_tag

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    )
    

     4,自定义simple_tag 中的装饰器用法

      (1)@register.simple_tag 使用方法

    {% my_simple_time 1 2 3%}     #my_simple为.py文件中的函数名,可以传多个参数,并且参数之间允许有空格
    

         (2)@register.filter

    {{"参数一"|处理函数名:"参数二"}}  #参数二只能有一个,如果需要传递两个参数,可以“参数二,参数三”,然后再后端函数中进行单独处理,
                       #应用场景在模板语言中的if判断中,例如{% if "参数一"|处理函数名:"参数二" %}

     五,django Cookie

      1,获取Cookie  

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
        参数:
            default: 默认值
               salt: 加密盐
            max_age: 后台控制过期时间
    

      2,设置Cookie

    rep = HttpResponse(...) 或 rep = render(request, ...)
     
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)
        参数:
            key,              键
            value='',         值
            max_age=None,     超时时间
            expires=None,     超时时间(IE requires expires, so set it if hasn't been already.)
            path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
            domain=None,      Cookie生效的域名
            secure=False,     https传输
            httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    

       3,由于Cookie保存在客户端电脑上,所以Javascript或者Jquery 都可以操作Cookie

    <script src='/static/js/jquery.cookie.js'></script>
    $.cookie("list_pager_num", 30,{ path: '/' });
    
  • 相关阅读:
    C#在window服务配置Log4Net.dll
    致于即将逝去的2108年,2019年您好
    关于:未能加载文件或程序集“ICSharpCode.SharpZipLib”或它的某一个依赖项异常的解决方案
    Vs 中关于项目中的某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”
    Git分布式版本控制器常用命令和使用
    微信公众平台网页登录授权多次重定向跳转,导致code使用多次问题
    Visual Studio高效实用的扩展工具、插件
    关于微信企业付款到零钱X509Certificate2读取证书信息,发布到服务器访问不到的解决方案
    关于ASP.NET MVC 项目在本地vs运行响应时间过长无法访问时,解决方法!
    彻底关闭windows10自动更新解决方案
  • 原文地址:https://www.cnblogs.com/system-public/p/6244312.html
Copyright © 2020-2023  润新知