zoukankan      html  css  js  c++  java
  • WebFramework-Basis-2nd

    周日,晴,记录生活分享点滴

    参考博客:https://www.cnblogs.com/yuanchenqi/articles/6083427.html

    Django 1.2

    Django URL路由系统

    本质是URL模式以及要为该URL模式调用的视图函数之间的映射表

    urlpatterns = [
        url(正则表达式, view函数, 参数, 别名),
    ]
    ​
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index , {"a":'123'} , 'FFF'),
    ]

    参数说明:

    • 一个正则表达式字符串

    • 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

    • 可选的要传递给视图函数的默认参数(字典形式)

    • 一个可选的name参数 (别名)

    示例:

    from django.conf.urls import url
    from app01 import views
    ​
    urlpatterns = [
        url(r'^index/', views.index),
        url(r'^articles/([0-9]{4})/$', views.year_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
    ]

    无命名分组

    加了( )后,视图函数需要添加一个形参,都为字符串类型

    # urls.py
    from django.conf.urls import url
    from django.contrib import admin
    ​
    from app01 import views
    ​
    urlpatterns = [
    ​
        # url为articles/2003/时执行
        url(r'^articles/2003/$', views.special_case_2003),
    ​
        # url为articles/2020/,除 2003 外时执行
        url(r'^articles/([0-9]{4})/$', views.year_archive),  # no_named group
    # url为articles/2020/07/时执行
        url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    ​
        # url为articles/2020/07/0123456789 时执行 
        url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), # "+"表示重复数字无穷次
    ​
    ]
    # 视图函数(views.py):
    def year_archive(request,y):
        return HttpResponse(y+"year"+m+"month")  # 后端在接收时,无须按照指定名字执行
    # 当在url中输入articles/2020/07时,输出:2020year07month

    命名分组

    视图函数形参名为分组名

    在 re 中

    import re
    ​
    ret=re.search('(?P<id>d{3})/(?P<name>w{3})','weeew34ttt123/ooo')
    '''
    ?P:固定格式,指分组时有名字的
    <id>:名字为id
    <name>:名字为name
    d{3}:匹配3个数字
    w{3}:匹配3个非数字的内容,即字母
    '''print(ret.group())        # 123/ooo
    print(ret.group('id'))    # 123
    print(ret.group('name'))  # ooo

    在 django 中

    # urls.py
    from django.conf.urls import url
      
    from . import views
      
    urlpatterns = [
        
        url(r'^articles/2003/$', views.special_case_2003),
        
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
        
    ]
    # 视图函数(views.py):
    def year_archive(request,year):
        return HttpResponse(year+"year"+month+"month")  # 后端在接收时,必须按照指定名字执行
    # 当在url中输入articles/2020/07时,输出:2020year07month

    参数

    加上参数时,对应的视图函数,必须加上一个形参,形参名必须与参数名相同

    如果参数名与正则分组名字相同时,后面覆盖前面

    urlpatterns = [
        url(r'^index/', views.index , {"a":'123'} , 'FFF'),
    ]
    def index(req, a):
        return render(req, "index.html")  # 123

    别名

    加载时,一行一行去查找 url 中 name = ‘new_login’ 的行 , 然后替换

    urlpatterns = [
        url(r'^index/', views.login, name = 'new_login'),
    ]
    ​
    # 用法:
    <form action = {% url 'new_login' %} >

    别名的应用

    urlpatterns = [
        url(r'^index',views.index,name='bieming'),
    ]
    ​
    # ---------------------------------------------------------------------
    def index(req):
        if req.method=='POST':
            username=req.POST.get('username')
            password=req.POST.get('password')
            if username=='alex' and password=='123':
                return HttpResponse("登陆成功")
        return render(req,'index.html')
    ​
    # ---------------------------------------------------------------------
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {#  <form action="/index/" method="post"> #}
         <form action="{% url 'bieming' %}" method="post">
             用户名:<input type="text" name="username">
             密码:<input type="password" name="password">
             <input type="submit" value="submit">
         </form>
    </body>
    </html># ---------------------------------------------------------------------
    ​
    settings 中注释掉: csrf该行进行测试demo
    MIDDLEWARE = [
        # 'django.middleware.csrf.CsrfViewMiddleware',
    ]

    URL映射分发

    每当Django 遇到 include()时,它会去掉URL 中匹配的部分并将剩下的字符串发送给包含的URLconf 做进一步处理

    from django.conf.urls import url,include
    ​
    urlpatterns = [
        url(r'^hot/', include('app01.urls')),
    ]

    例子中的正则表达式没有包含 $(字符串结束匹配符),但是包含一个末尾的斜杠。

    from django.conf.urls import url,include
    from app01 import views
    ​
    urlpatterns = [
        url(r'^all/', views.allpage),
    ]

    页面访问 http://127.0.0.1:8000/hot/all 时触发views.allpage

     

    Django Views(视图函数)

    http请求中产生两个核心对象:

    • http请求:HttpRequest对象

    • http响应:HttpResponse对象

    所在位置:django.http

    视图函数接收的参数request就是HttpRequest

    检测方法:isinstance(request,HttpRequest)

    HttpRequest对象的属性:

    path:       请求页面的全路径,不包括域名
    ​
    method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
                       if  req.method=="GET":
                                 do_something()
                       elseif req.method=="POST":
                                 do_something_else()
    ​
    GET:         包含所有HTTP GET参数的类字典对象
    ​
    POST:       包含所有HTTP POST参数的类字典对象
                 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
                 HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
                 if req.POST来判断是否使用了HTTP POST 方法;应该使用  if req.method=="POST"
    ​
    COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。
    ​
    FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
                 filename:      上传文件名,用字符串表示
                 content_type:   上传文件的Content Type
                 content:       上传文件的原始内容
    ​
    user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                 可以通过user的is_authenticated()方法来辨别用户是否登陆:
                 if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                 时该属性才可用
      
    session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

    HttpRequest对象的方法:

    get_full_path() 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path() 得到的结果就是/index33/?name=123

    HttpResponse对象

    对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。

    每个view请求处理方法必须返回一个HttpResponse对象。

    HttpResponse 类在 django.http.HttpResponse

    在HttpResponse对象上扩展的常用方法:

    • 页面渲染:render,render_to_response,

    • 页面跳转:redirect

    • locals(): 可以直接将函数中所有的变量传给模板

    from django.shortcuts import render,HttpResponse,redirect,render_to_response
    import time
    ​
    def index(request):
        times = time.time()
        
        return render(request,'index.html',{"times":times})  # 页面渲染
       
        return render(request,'index.html',locals())         # 页面渲染 , HTML文件路径在Setting文件中做了拼接处理!
       
        return render_to_response('index.html',locals())     # 页面渲染 , 可以不用填写request
        
        return redirect('/login')                            # 跳转
    <!-- Demo: index.html -->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ times }}</h1>
    </body>
    </html>
  • 相关阅读:
    Nginx编译安装及平滑升级
    alertmanager 分组,抑制, 静默
    alertmanager 邮件告警&自定义告警模板
    alertmanager 高可用
    程序运行报错UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte
    Postman 导入curl 、导出成curl、导出成对应语言代码
    Python 字符串操作(截取/替换/查找/分割)
    In testLogin: indirect fixture *** doesn‘t exist
    postman 传参传递二进制流文件
    开发经验01
  • 原文地址:https://www.cnblogs.com/chungzhao/p/13287046.html
Copyright © 2011-2022 走看看