Django Book 学习笔记(上)

时间:2022-02-14 09:34:55

拜读了网上的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] AZ中任意一个字符(大写)
[a-z] az中任意一个字符(小写)
[A-Za-z] az中任意一个字符(不区分大小写)
+ 匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+ 一个或多个不为‘/’的字符
* 零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
* 匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3} 介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)

Django中请求视图(request)与响应视图(response)的过程大抵是这样:

  1. 进来的请求转入/hello/.

  1. Django通过在ROOT_URLCONF配置来决定根URLconf.

  1. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。

  1. 如果找到匹配,将调用相应的视图函数

  1. 视图函数返回一个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 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信; 绕过这些网站的安全系统也是易如反掌。