zoukankan      html  css  js  c++  java
  • django小结


    一、配置文件

    1.media

     在上传头像的时候会用到media,首先需要在setting中加下面这一句话

    MEDIA_ROOT=os.path.join(BASE_DIR,"blog","media","uploads")

    在models中为,语句为avatar = models.FileField(upload_to='avatar')

    其中会涉及到几个参数,blog为所在项目的app名,media为上传文件所在的自己建的文件夹,uploads为上传到。。。

     url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),    #  year_archive(request,year=1990)

    客户端的配置(url的分发)需要加上下面两句:

    MEDIA_URL="/media/"
    url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

    一般情况下上传文件有两种方式:

    一种是直接在img标签中写上传路径的url,即

    <img src="/media/avatar/a.png">

      另外一种是在前端页面进行渲染(模板语法),后面.url

    {{current.user.avatar.url}}  ------常用

    复制代码
    '''
            静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的:
    
        MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义
        
        MEDIA_ROOT=c:	empmedia,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:	empmediaabc
    
        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上传的图片就上传到c:	empmediaphoto,而在模板中要显示该文件,则在这样写
          在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\','/')
    
        MEDIA_URL是指从浏览器访问时的地址前缀,举个例子:
            MEDIA_ROOT=c:	empmediaphoto
            MEDIA_URL="/data/"
        在开发阶段,media的处理由django处理:
    
           访问http://localhost/data/abc/a.png就是访问c:	empmediaphotoabca.png
    
           在模板里面这样写&lt;img src="/media/abc/a.png"&gt;
    
           在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置,
           以便能让web服务器能访问media文件
           以nginx为例,可以在nginx.conf里面这样:
    
                 location ~/media/{
                       root/temp/
                       break;
                    }
    
           具体可以参考如何在nginx部署django的资料。
           
           
           </span><span style="color: #800000;">'''</span></pre>
    
    复制代码

    二、url的配置

    在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

    在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

    1.有名分组

     url(r'^articles/([0-9]{4})/$', views.year_archive),    #  year_archive(request,1990)

    2.无名分组

     url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),    #  year_archive(request,year=1990)

    区别:

    有名分组在url路径中后面要写上?以及大写的p,再用一对<>写上自己所定义的名字。

    下面是以上URLconf 使用命名组的重写:

    复制代码
    from django.conf.urls import url
    

    from . import views

    urlpatterns = [
    url(r
    '^articles/2003/(</span><span style="color: #800000;">'</span><span style="color: #000000;">, views.special_case_2003), url(r</span><span style="color: #800000;">'</span><span style="color: #800000;">^articles/(?P&lt;year&gt;[0-9]{4})/)', views.year_archive),
    url(r
    '^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(</span><span style="color: #800000;">'</span><span style="color: #000000;">, views.month_archive), url(r</span><span style="color: #800000;">'</span><span style="color: #800000;">^articles/(?P&lt;year&gt;[0-9]{4})/(?P&lt;month&gt;[0-9]{2})/(?P&lt;day&gt;[0-9]{2})/)', views.article_detail),
    ]

    复制代码

    三、反向解析

         因为Django奉行的是DRY原则,所以使用这种方式,就无需对url地址进行硬编码.在原本需要硬编码url的地方,直接可以使用url的名字,然后逆向解析出url地址.

        Django提供了不同层面上的url解析方法.

    • template文件: 用url模板标签
    • python代码中可以使用django.core.urlresolvers.reverse()
    • 其他get_absolute_url()

    1.url的反向解析

    解析的过程可以概括为URL request -> view calling
    同时,django又提供了另一种解析方式 - Reverse resolution of URLs
    它的解析过程为 view calling -> URL request

    2.in template(模板反向解析): 

    3.in views(视图函数反向解析)

     例子:

    考虑下面的URLconf:

    复制代码
    from django.conf.urls import url
    

    from . import views

    urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
    ]

    复制代码

    根据这里的设计,某一年nnnn对应的归档的URL是/articles/nnnn/

    你可以在模板的代码中使用下面的方法获得它们:

    复制代码
    <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    

    <ul>
    {
    % for yearvar in year_list %}
    <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
    {
    % endfor %}
    </ul>

    复制代码

    在Python 代码中,这样使用:

    复制代码
    from django.core.urlresolvers import reverse
    from django.http import HttpResponseRedirect
    

    def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

    复制代码

    四、视图函数

    HttpResponse对象属性总结:

    属性:
      django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。
       除了特殊说明的之外,其他均为只读的。
    

    '''

    1.HttpRequest.body

      一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。

      但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。

      另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。

    2.HttpRequest.path

      一个字符串,表示请求的路径组件(不含域名)。

      例如:"/music/bands/the_beatles/"

    3.HttpRequest.method

      一个字符串,表示请求使用的HTTP 方法。必须使用大写。

      例如:"GET"、"POST"

    4.HttpRequest.encoding

      一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
    这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
    接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
    如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。

    5.HttpRequest.GET

      一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

    6.HttpRequest.POST

      一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。

      POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
    因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST"

      另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。

    7.HttpRequest.REQUEST

      一个类似于字典的对象,它首先搜索POST,然后搜索GET,主要是为了方便。灵感来自于PHP 的 $_REQUEST。

      例如,如果 GET = {"name": "john"} 而 POST = {"age": '34'} , REQUEST["name"] 将等于"john", REQUEST["age"] 将等于"34"。

      强烈建议使用 GET 和 POST 而不要用REQUEST,因为它们更加明确。

    8.HttpRequest.COOKIES

      一个标准的Python 字典,包含所有的cookie。键和值都为字符串。

    9.HttpRequest.FILES

      一个类似于字典的对象,包含所有的上传文件信息。
    FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。

      注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
    包含数据。否则,FILES 将为一个空的类似于字典的对象。

    10.HttpRequest.META

      一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:

    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE —— 请求的正文的MIME 类型。
    HTTP_ACCEPT —— 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
    HTTP_HOST —— 客服端发送的HTTP Host 头部。
    HTTP_REFERER —— Referring 页面。
    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR —— 客户端的IP 地址。
    REMOTE_HOST —— 客户端的主机名。
    REMOTE_USER —— 服务器认证后的用户。
    REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
    SERVER_NAME —— 服务器的主机名。
    SERVER_PORT —— 服务器的端口(是一个字符串)。
    

      从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。
    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。

    11.HttpRequest.user

      一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。

      如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

    例如:
    
    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.
     
    
       user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
    
     -------------------------------------------------------------------------------------
    
    匿名用户
    class models.AnonymousUser
    
    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:
    
    id 永远为None。
    username 永远为空字符串。
    get_username() 永远返回空字符串。
    is_staff 和 is_superuser 永远为False。
    is_active 永远为 False。
    groups 和 user_permissions 永远为空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
    

    12.HttpRequest.session

      一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
    完整的细节参见会话的文档。

    13.HttpRequest.resolver_match

      一个 ResolverMatch 的实例,表示解析后的URL。这个属性只有在 URL 解析方法之后才设置,这意味着它在所有的视图中可以访问,
    但是在 URL 解析发生之前执行的中间件方法中不可以访问(比如process_request,但你可以使用 process_view 代替)。
    '''

    View Code

    响应对象-----response:
    return HttpResponse("") # 返回字符串实例
    return render(request,"template",{"":""}) # 返回字符串实例 (**********)
    return redirect("/index/") # 重定向 (**********) 实质上发送了两次请求

    五、模板语言

    view.py

    1
    2
    3
    4
    5
    def foo():
       name="yuan"
       l=[111,222,333]
       d={"info":[obj1,obj2]}
     returnr render(request,"index.html",locals())

     1.变量{{name}} 

    ---深度查询 句点符 {{l.0}} {{d.info.0.name}}

    ----过滤器:{{name|date:"Y-m-d"}}

       2.标签

    复制代码
                  {%for i in l%}
                      {{i}}
    
               {</span>%empty%<span style="color: #000000;">}  
                </span>&lt;p&gt;没有符合条件的书籍&lt;/p&gt;<span style="color: #000000;">
               {</span>%endfor%<span style="color: #000000;">}
               
               </span>--------<span style="color: #000000;">
               
               {</span>%<span style="color: #0000ff;">if</span> name == <span style="color: #800000;">"</span><span style="color: #800000;">yuan</span><span style="color: #800000;">"</span>%<span style="color: #000000;">}
                </span>&lt;p&gt;真帅&lt;/p&gt;<span style="color: #000000;">
                
               {</span>%<span style="color: #0000ff;">elif</span> ...%<span style="color: #000000;">}    
               {</span>%endif%<span style="color: #000000;">}
               </span></pre>
    
    复制代码

       3.模板继承 

    (1) base.html   :   {%block con%}{%end block con%}
    (2) index.html: 
      {% extends "base.html"%}         继承    
        {%block con%}
          {{block.super}}              模板盒子中内容
         {%end block con%}                 覆盖    

    六、model模型(ORM)

    映射关系:
    sql中表名--------------python的类名
    sql中表的字段----------python的类属性
    sql中表的记录----------python的类对象

  • 相关阅读:
    test
    VS dll 引用依赖
    Git配置
    编码--文字输入的前因后果
    base64相关
    异或
    UNION / UNION ALL 区别
    数据库使用规范
    chrome插件开发学习(一)
    缓存穿透 缓存雪崩 缓存并发
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12037062.html
Copyright © 2011-2022 走看看