10.Django细节性知识点回顾(二)

  1. 云栖社区>
  2. 博客>
  3. 正文

10.Django细节性知识点回顾(二)

thinkgamer.cn 2016-09-11 13:07:00 浏览812


这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】


转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758 (欢迎互撩)
Github:https://github.com/thinkgamer

Django系列教程

00.Python manage.py shell和 Python的分析
01.Django学习之安装,建立项目,传参,MySQL数据库,静态文件配置和模板的使用
02.Django后台和数据库的设计
03.Django的MTV开发模式详解和模型关系构建
04.Django实现完整登录系统的两种方法(cookie and session)
05.Django表单的使用
06.Django中用户的两种扩展方式(Profile和AbstractUser)
07.Django中的自定义认证方式和权限的设计与使用
08.Django自定义模板,自定义标签和自定义过滤器
09.Apache 2.4 基于端口配置多个Diango项目

=============================================================================

写在前边的话

              先吐槽一下吧,小主尝试用md编辑博客,然后花了挺长时间写了Django的细节性知识点回顾(一),然后发现(一)太长了,就想再编辑一个(二)于是就新建了一篇博客,然后打开的内容却是(一)的内容,没注意太多,以为是默认加载呢,然后的然后(一)就没了,就剩下现在的(二)了。
              Django自己也学习了有一段时间了,从建立最简单的项目到服务器的部署,从基本的views视图到复杂交互,这其中感悟颇多,但最近由于做一个分布式的文件系统需要做可视化,由于小编对别java有点白痴,所以就重新选择了Django,且著名的HUW就是使用django开发的,我也很骄傲的给我的可视化起了一个牛逼的名字——HIW(hadoop in web),github地址:点击查看
              本篇博客不针对具体的技术解释,只是对django的一个概要性总结,常见的技术点不过多阐述,而是谈一些容易忽略的和需要注意的点

言归正传

dots(.)查找顺序

  当模板在系统中遇见dots时,默认的查找顺序是:

  • 字典类型查找 (比如 foo[“bar”] )
  • 属性查找 (比如 foo.bar )
  • 方法调用 (比如 foo.bar() )
  • 列表类型索引查找 (比如 foo[bar] )

标签

if/else

该标签中不存在 elif ,使用时需注意,若要达到elif的效果,可以使用多个if

for

for标签支持一个 {% empty %}即当编立的list为空时,输出的内容,使用形式

{% for person in person_list %}
    <p>{{ person }}</p>
{% empty %}
    <p>this is empty</p>
{% end for %}
在每个{% for %}循环里有一个称为forloop 的模板变量。 这个变量有一些提示循环进度信息的属性。

forloop.counter :总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。
forloop.counter0 :类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。
forloop.revcounter :是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1
forloop.revcounter0: 类似于 forloop.revcounter ,但它以0做为结束索引。 在第一次执行循环时,该变量会被置为序列的项的个数减1。
forloop.first: 是一个布尔值,如果该迭代是第一次执行,那么它被置为““

ifequal/ifnotequal

    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

注释

单行注释

{# This is a comment #}

多行注释

{% comment %}
    This is a
    multi‐line comment.
{% endcomment %}

过滤器

truncatewords

显示变量的前n的字符

{{ content | truncatewords:"30" }}

但是他有一个缺点就是对中文支持不好,对于中文我们可以使用slice切片

{{ content | slice:'30' }}

可以多级嵌套使用,例如获取一个字符串的前三十个字符,都转换成大写

{{ content | truncatewords:"30" | upper}}

Django的重定向

render_to_response

from django.shortcuts import render_to_response
def hello(request):
    return render_to_response("hello.html",{
    "name":name,
    })

HttpResponseRedirect

不支持传递字典类型的参数,若需的话可以在url中进行传递

from django.http   import HttpResponseRedirect
def hello(request):
     return HttpResponseRedirect("/index/hello")

render

from django.template import Context, Template
def hello(request):
    t = Template('My name is {{ name }}.')
    c = Context({'name': 'nowamagic'})
    return t.render(c)

MTV开发模式

把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller(MVC)模式。 在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:
M :数据存取部分,由django数据库层处理,本章要讲述的内容。
V :选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
C :根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的

由于 C (Controller)由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),
Django 也被称为 MTV 框架 。在 MTV 开发模式中:
M :代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T :代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V :代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

request携带的信息

request.META是一个python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。 这个字典中几个常见的键值有

  • HTTP_REFERER ,进站前链接网页,如果有的话。 (请注意,它是 REFERRER 的笔误。)
  • HTTP_USER_AGENT ,用户浏览器的user-agent字符串,如果有的话。 例如:
    “Mozilla/5.0 (X11; U; Linux i686; fr‐FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17” .
  • REMOTE_ADDR 客户端IP,如: “12.345.67.89” 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如: “12.345.67.89,23.456.78.90” 。)

Django中的URL

Url无非提供的是用户访问链接的一种解析,通常有两种方式:

  • 直接定位到最后的一个试图,比如我们创建了一个myblog的项目,在项目下创建了一个子目录(APP)article,article下有个视图函数blog,我们在myblog的urls.py中可以这样写,便可以直接访问article里的视图函数了
  url(r'^myblog/article/$','myblog.views.blog'),
  • 当然我们也可以先定位article的urls.py,再由该部分索引到相应的视图函数
 定位到子目录 
 myblog的urls.py加入url(r'^article/',include('article.urls'))
 再定位到具体文件
 article的urls.py加入url(r'^blog/$', 'article.views.blog')

URL中的正则表达式
    上边我们举得例子是通过例子来说明是静态的url,即在url中不传递任何的参数,但是这样并不能满足真实环境的需要,在真实的环境中,往往需要url来传递一些参数,一个最常用的例子是查看某篇博客,我们通常定义一篇文章的模板页,然后根据博客的唯一id将该篇博客的信息加载到模板页中,这时候就要用到url正则匹配了
    eg:一篇博客的id是由8位数字组成,紧接上边的例子,在调用blog视图函数时,需要传入一个8位的blog_id,这时候我们需要可能会这样写:

url(r'^blog/(\d{8})/$', 'article.views.blog')

    如果blog_id是6-8位的数字组成,你要这样写

url(r'^blog/(\d{6,8})/$', 'article.views.blog')

    如果这里需要先传入一个用户名,是由用户自定义的name,再传入bid,这时候要这样写

url(r'^blog/(\w+)/(\d{6,8})/$', 'article.views.blog')

    当然这里你可以使用命名组使你的url看起来更直观一点,就像这样的url,表面搜索的关键字是CSDN
https://www.baidu.com/s?wd=CSDN
    这时候我们得到url可以这样写

url(r'^blog/(?P<name>\w+/?P<bid>\d{6,8}/$', 'article.views.blog')

省略模式
    有一种很常见的用法便是,当我们输入127.0.0.1:8000时,我们希望访问的直接是首页,而不是输入127.0.0.1:8000/index/index才会跳转到首页,这时候我们就要省略了

url(r'^/$', 'index.views.index')

    需要注意的是:该url只能放在项目总的urls.py中的最后,否则访问任何一个页面都会跳到index页面了

Model的高级用法
  • safe过滤器为单独的变量关闭自动转意
    MyName: {{ name }}
    MyName: {{ name|safe }}
  • autoescapeg关闭模板块的自动转意
             通常的用法是,我们在显示一篇博客内容时,对整体内容进行autoescapeg
    {% autoescape off %}
     {{ text }}
    {% endautoescape %}

         如果你只想对一部分转意,另外一部分不转意,比如说博客内容域里需要有一个摘要,你想对摘要转意,而对文本内容不转意,你可以这样写

{% autoescape off %}
    {% autoescape on %}
        {{ zhaiyao }}
    {% endautoescape %}
    {{ text }}
{% endautoescape %}
  • 自定义模板,标签和过滤器

              参考之前的一篇博客:Django自定义模板,自定义标签和自定义过滤器

  • 模型方法
    所谓的模型方法就是在定义模型类的时候,同时定义一些方法,比如说这样一个场景,在注册信息时需要填写姓,名,调用时返回完整的姓名,这里只是举例,不必考虑必要性
    models.py
class Person(models.Model):
    xing = models.CharField(max_length=15)
    ming = modelx.CharField(max_length=20)
    def __str__(self):
        return self.xing
    class META:
        db_table = "name"
    #自定义方法,返回完整姓名
    def get_full_name(self):
        return y'%s%s' % (slef.xing+self,name)

部署时的注意事项
  • 关闭DEBUG
        默认情况下,django的debug模式为True,此时也是为了方便调试代码,但是一旦部署的时候,要千万一定要设置debug为False,避免别人利用你网站的漏洞,造成一些不必要的危害
        如果设置为False,一旦发生错误,django会显示在你模板根目录中名字叫404.html的文件,所以当你部署你得网站时,可以自己做一个比较好看的404网页
  • 设置错误警告
        当你的django网站发生一些错误时,你希望去了解然后修复他,这时候你就需要配置发送邮件,将错误信息发送至开发者团队的邮箱中。
        在settings.py最后添加
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

EMAIL_USE_TLS = True
EMAIL_HOST= 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxxxxx@163.com'
EMAIL_HOST_PASSWORD = 'xxxx'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

               发送邮件的代码应该是这样的

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

               部署在Apache上可参考:Apache 2.4 基于端口配置多个Diango项目

End