拜读了网上的Django Book,现在来总结一下吧。。。。。。
一.Django的配置
非常的蛋疼,由于Django的块组之间耦合度低,这既是它的优点,也是它的缺点。我在Ubuntu所配置的Django的开发环境是:Django1.6+PostgreSQL+Nginx+uwsgi+Memcached(缓存机制)。配置起来确实麻烦,但不得不说Nginx的反向代理真的非常好用,uwsgi作为Django和Nginx之间的桥梁。
想知道怎么配置自己上网查吧。这里不多说了。
二.Django的几条重要的命令
>>>python manage.py shell #启动交互界面 >>>python setup.py install #安装Django $:django-admin.py startproject mysite #新建一个web项目 >>>python manage.py runserver 端口号 #启动Django自带的服务器 $:uwsgi -s :端口号 -w run_uwsgi(配置文件)
>>>python manage.py startapp books #新建一个APP
>>>python manage.py syncdb #打印sql语句
三.视图与URL设置
hello 的demo:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
同时在urls.py作出相应的配置:
from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )
附录一下Django要用到的正则符号吧(不过还是自己先学一下正则表达式比较好):
符号 | 匹配 |
---|---|
. (dot) | 任意单一字符 |
d | 任意一位数字 |
[A-Z] | A 到 Z中任意一个字符(大写) |
[a-z] | a 到 z中任意一个字符(小写) |
[A-Za-z] | a 到 z中任意一个字符(不区分大小写) |
+ | 匹配一个或更多 (例如, d+ 匹配一个或 多个数字字符) |
[^/]+ | 一个或多个不为‘/’的字符 |
* | 零个或一个之前的表达式(例如:d? 匹配零个或一个数字) |
* | 匹配0个或更多 (例如, d* 匹配0个 或更多数字字符) |
{1,3} | 介于一个和三个(包含)之前的表达式(例如,d{1,3}匹配一个或两个或三个数字) |
Django中请求视图(request)与响应视图(response)的过程大抵是这样:
-
进来的请求转入/hello/.
-
Django通过在ROOT_URLCONF配置来决定根URLconf.
-
Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
-
如果找到匹配,将调用相应的视图函数
-
视图函数返回一个HttpResponse
6.Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
四.模板
模板的调用并不复杂,但是关于模板的标签的内容有点多,这部分估计还是要看一下Django Book
下面给出一个有用到模板继承以及最精简调用试图的demo:
Bash.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html>
current_datetime.html {% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %}
#views.py中的current_datetime函数 from django.shortcuts import render_to_response import datetime def current_datetime(request): now = datetime.datetime.now() return render_to_response('current_datetime.html', {'current_date': now})
五.模型
在将模型之前,先介绍一下Django不同于其他MVC框架的一种另外的思想:MTV思想。
Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:
-
M ,数据存取部分,由django数据库层处理,本章要讲述的内容。
-
V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。
-
C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:
-
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
-
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
-
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
如果你熟悉其它的 MVC Web开发框架,比方说 Ruby on Rails,你可能会认为 Django 视图是控制器,而 Django 模板是视图。 很不幸,这是对 MVC 不同诠释所引起的错误认识。 在 Django 对 MVC 的诠释中,视图用来描述要展现给用户的数据;不是数据 如何展现 ,而且展现 哪些 数据。 相比之下,Ruby on Rails 及一些同类框架提倡控制器负责决定向用户展现哪些数据,而视图则仅决定 如何 展现数据,而不是展现 哪些 数据。
两种诠释中没有哪个更加正确一些。 重要的是要理解底层概念。
模型的内容有很多,还是自己看一下书吧。
六.管理
Django有自己的管理数据库的模块,类似与php的phpmyadmin。
七.表单
GET方法的demo:
def search(request): error = False if 'q' in request.GET: q = request.GET['q'] if not q: error = True else: books = Book.objects.filter(title__icontains=q) return render_to_response('search_results.html', {'books': books, 'query': q}) return render_to_response('search_form.html', {'error': error})
POST方法的demo:
from django.core.mail import send_mail from django.http import HttpResponseRedirect from django.shortcuts import render_to_response def contact(request): errors = [] if request.method == 'POST': if not request.POST.get('subject', ''): errors.append('Enter a subject.') if not request.POST.get('message', ''): errors.append('Enter a message.') if request.POST.get('email') and '@' not in request.POST['email']: errors.append('Enter a valid e-mail address.') if not errors: send_mail( request.POST['subject'], request.POST['message'], request.POST.get('email', 'noreply@example.com'), ['siteowner@example.com'], ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact_form.html', {'errors': errors})
记得:对于成功的GET请求,我们应使用render_to_response返回;而对于成功的POST请求,我们应用HttpResponseRedirect做重定向,这是web开发的最佳实践。
八.输出非html内容
视图与MIME类型:
视图函数只是一个以Web请求为参数并返回Web响应的Python函数。这个响应可以是一个Web页面的HTML内容,或者一个跳转,或者一个404错误,或者一个XML文档,或者一幅图片,或者映射到任何东西上。
输出png图像:
from django.http import HttpResponse def my_image(request): image_data = open('/home/dzhwen/swift.jpg') return HttpResponse(image_data,mimetype="image/png")
输出CSV文件:
import csv from django.http import HttpResponse # Number of unruly passengers each year 1995 - 2005. In a real application # this would likely come from a database or some other back-end data store. UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203] def unruly_passengers_csv(request): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename=unruly.csv' # Create the CSV writer using the HttpResponse as the "file." writer = csv.writer(response) writer.writerow(['Year', 'Unruly Airline Passengers']) for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS): writer.writerow([year, num]) return response
输出pdf文件:
from cStringIO import StringIO from reportlab.pdfgen import canvas from django.http import HttpResponse def hello_pdf(request): response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=hello.pdf' temp = StringIO() p = canvas.Canvas(temp) p.drawString(100,100,"Hello world.") p.showPage() p.save() return response
九.会话,用户和注册
好坏参半的Cookies
也许你已经注意到了,cookies的工作方式可能导致的问题。 让我们看一下其中一些比较重要的问题:
- cookie的存储是自愿的,一个客户端不一定要去接受或存储cookie。 事实上,所有的浏览器都让用户自己控制 是否接受cookies。 如果你想知道cookies对于Web应用有多重要,你可以试着打开这个浏览器的 选项:
- 尽管cookies广为使用,但仍被认为是不可靠的的。 这意味着,开发者使用cookies之前必须 检查用户是否可以接收cookie。
- Cookie(特别是那些没通过HTTPS传输的)是非常不安全的。 因为HTTP数据是以明文发送的,所以 特别容易受到嗅探攻击。 也就是说,嗅探攻击者可以在网络中拦截并读取cookies,因此你要 绝对避免在cookies中存储敏感信息。 这就意味着您不应该使用cookie来在存储任何敏感信息。
- 还有一种被称为”中间人”的攻击更阴险,攻击者拦截一个cookie并将其用于另一个用户。 第19章将深入讨论这种攻击的本质以及如何避免。
- 即使从预想中的接收者返回的cookie也是不安全的。 在大多数浏览器中您可以非常容易地修改cookies中的信息。有经验的用户甚至可以通过像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 这样的工具手工构造一个HTTP请求。
- 因此不能在cookies中存储可能会被篡改的敏感数据。 在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信; 绕过这些网站的安全系统也是易如反掌。