打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处: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 |