[关闭]
@hpp157 2016-08-18T04:27:38.000000Z 字数 7066 阅读 2430

django学习 第一章

Django


本章最后的模板部分代码已经上传到github,需要的可以下载:download

从Django框架诞生以来,数目众多的其他web框架也在很多开源社区出现。如专注前端的框架如Angular.jsEmber.js以及Backbone.js在Javascript社区出现,并且成为现代web框架的领跑者.Django在哪一块适应了这些呢?我们怎样把这些MVC框架融入到Django的核心框架中呢
本书教你怎样利用Django粉丝所谓的“内置电池(batteries included)”哲学的优点。指导你走出“对于快速发展的应用开发来说,Django太重(重型框架)的误区”。从构建一个世界上最小的Django程序的目标出发来写一个RESTFULL API,让你了解这款流行的python WEB 开发框架的优点

安装

ubuntu 16.04
安装pip
sudo wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
sudo python get-pip.py
安装Django 1.9.9
sudo pip installl django==1.9.9

hello Django

许多新的语言都是以hello world的例子作为开始,我们用flask社区的hello world的例子来展示这个微型框架是怎么的一个微型

本章,我们使用单个文件hello.py开始,这个文件将会包括我们的django项目的所有代码,我们需要建一个view来处理根路径(root URL)以及对项目做些必要的设置

创建view

Django被称为(referred to as)一个MTV框架model-template-view.这个view端口一般看作存放HTTP请求的进入查询结构,以及输出到展示层所必须的数据的地方
在我们的hello.py这个例子中,让我们创建一个简单的方法来执行hello,world的相应

  1. from django.http import HttpResponse
  2. def index(request):
  3. return HttpResponse('hello,world')

在一个大的项目中,这应该在你的apps里的views.py文件里面,但是本教程并不要求这样,这样做仅仅是一个惯例而已

URL模式

为了把我们的view和网站结构联系起来,我们需要用一个urlview联系起来,在这个例子中,根目录可以独自处理view。Django关联一个viewsURL通过正则表达式匹配url,以及任意可调用的参数到view

  1. from django.conf.urls import url
  2. from django.http import HttpResponse
  3. def index(request):
  4. return HttpResponse('hello,world')
  5. urlpatterns =(
  6. url(r'^$',index),
  7. )

现在,这个文件结合了views.py和路径urls.py。再次强调下,把URL pattern放到urls.py文件中不是必须的,它们可以存在于python任何重要的模块中

设置

设置包括数据库缓存语言静态资源上传路径等设置。对于新的开发者来说,django的设置是一个难点,虽然新版本已经缩减了设置文件的长度
这个例子将在debug模式下运行,除了这,django仅仅需要设置项目路径在哪儿可以找到以及在那个模块中使用定义过urlpatterns变量。在hello.py例子中,当前模块的root URLS会使用前一节定义过的urlpatterns

  1. from django.conf import settings
  2. settings.configure(
  3. DEBUG = True,
  4. SECRET_KEY ='thisisthesesecretkey',
  5. ROOT_URLCONF = __name__,
  6. MIDDLEWARE_CLASSES=(
  7. 'django.middleware.common.CommonMiddleware',
  8. 'django.middleware.csrf.CsrfViewMiddleware',
  9. 'django.middleware.clickjacking.XframeOptionsMiddleware'
  10. ),
  11. )

这个例子中包括了一个专门的SECRET_KEY设置,这个设置不能用于生产环境,一个安全密钥必须由默认的session以及跨域访问保护生成。

我们需要在模块从django导入之前进行设置。通常,这些设置包含在专门的settings.py中,这个settings.py文件通过默认的startproject命令自动创建,自动创建的会包含一些其他的设置。

运行例子

让我们看下例子运行起来是什么样子把,一个典型的django项目包含一个manage.py文件,它用来运行各种各样的命令,比如创建数据库的表以及运行服务器。这个文件本身只有10行代码。我们会把manage.py的功能添加到`hello.py'中

  1. import sys
  2. from django.conf import settings
  3. settings.configure(
  4. DEBUG = True,
  5. SECRET_KEY ='thisisthesesecretkey',
  6. ROOT_URLCONF = __name__,
  7. MIDDLEWARE_CLASSES=(
  8. 'django.middleware.common.CommonMiddleware',
  9. 'django.middleware.csrf.CsrfViewMiddleware',
  10. 'django.middleware.clickjacking.XFrameOptionsMiddleware'
  11. ),
  12. )
  13. from django.conf.urls import url
  14. from django.http import HttpResponse
  15. def index(request):
  16. return HttpResponse('hello,world')
  17. urlpatterns =(
  18. url(r'^$',index),
  19. )
  20. #manage.py的功能
  21. if __name__ == '__main__':
  22. from django.core.management import execute_from_command_line
  23. execute_from_command_line(sys.argv)

现在你可以同过命令行运行例子了

  1. $ python hello.py runserver

打开浏览器访问http://localhost:8000或者输入127.0.0.1:8000

第二部分

改进

这个例子展示了django的基础功能,写view,设置seting,运行管理命令。从本质上来说,django是一个python语言的web框架,处理客户端过来的http request以及向客户端返回http response,至于中间怎么做,完全取决于你自己
Django还提供额外的工具来处理HTTP请求的日常任务,比如html文件的渲染,表单数据的解析以及session状态的持久化。理解这些功能对于让你的程序变的轻量是非常重要的。通过这样,你可以全面理解Django框架获得真正的技能。

WSGI 应用

目前,我们的hello,world项目通过命令行的命令runserver来运行,这是一个基于标准库之上的socket server,它对于本地环境开发非常有帮助,但不适合生产环境,会引起一些安全问题
WSGI是用来具体说明让web服务器http和应用web框架比如Django之间如何交流的。它通过PEP333以及改进的PEP333定义。web服务器有非常多种,比如apache,Gunicorn,uWSGI,CherryPy,Tornado以及Chaussette
每一个服务器都需要定义一个符合WSGI接口的程序来使用,django有一个很容易使用的接口,用法就是通过get_wsji_application来创建这个应用。

  1. ...
  2. from django.conf.urls import url
  3. from django.core.wsgi import get_wsgi_application
  4. from django.http import HttpResponse
  5. application = get_wsgi_application()
  6. if __name__ == '__main__':
  7. from django.core.management import execute_from_command_line
  8. execute_from_command_line(sys.argv)

正常情况下,这些应该保存在通过startproject命令创建项目时自动生成的wsgi.py的文件中。至于这个叫做application的名字,它只是个惯例,大多数的WSGI服务器都这么叫。每个服务器都可以通过配置文件更改这个名字。

现在我们的符合WSGI接口的程序弄好了,就等着一个WSGI服务器了。Gunicorn是一个比较流行的WSGI服务器,它可以通过PIP命令来安装

  1. sudo pip install gunicorn


gunicorn安装之后,你可以通过命令行运行它

  1. gunicorn hello --log-file=-

打开浏览器,输入localhost:8000就可以看到程序再次运行起来了

额外的设置

虽然Gunicorn是为生产环境准备的一个服务器,但是程序现在还不能部署到生产环境,生成环境需要关闭DEBUG模式,SECRET_KEY也不能被这么明显的看到,应该随机生成并且进行加密来保证安全。
这就导致Django社区产生一个问题,在一个项目中怎样来管理不同的开发阶段,不同的生产环境的设置。社区也有很多的办法,比如把settings.py转换成一个包,来为每一个环境创建一个设置模块,但是,我们这个项目并不适合这样做。
十二要素应用(The Twelve-Factor App)主张web应用应该从环境变量里获取其配置。 这一实践很快被现代PaaS服务采用以用于允许简单的配置变更。
我们把这一方法应用到项目中,只需要进行设置DEBUGSECRET_KEY这两个需要改变的值就可以了。

  1. import os
  2. import sys
  3. from django.conf import settings
  4. DEBUG = os.environ.get('DEBUG', 'on') == 'on'
  5. SECRET_KEY = os.environ.get('SECRET_KEY', os.urandom(32))
  6. settings.configure(
  7. DEBUG=DEBUG
  8. , SECRET_KEY=SECRET_KEY
  9. , ROOT_URL_CONF=__name__
  10. , MIDDLEWARE_CLASSES=(
  11. 'django.middleware.common.CommonMiddleware',
  12. 'django.middleware.csrf.CsrfViewMiddleware',
  13. 'django.middleware.clickjacking.XFrameOptionsMiddleware'
  14. ),
  15. )

你可能会注意到,默认的DEBUG是开启的,并且SECRET_KEY会在程序每次启动的时候重新随机生成一个。我们这个小项目自然无碍,但是假入碰到程序需要SECRET_KEY保持稳定的情况,比如signed cookies,会导致程序频繁失效。
让我们启动下程序来测试一下上面的设置,将DEBUG默认的开启改为关闭,我们需要设置DEBUG的环境变量为off,在unix系统中,如linux,OSX(现在叫 mac OSX),或者FreeBSD,环境变量通过命令行中的export命令来设置。要是window的话,用set

  1. hunter@hunter:~$ export DEBUG=off
  2. hunter@hunter:~$ python hello.py runserver
  3. CommandError: You must set setting.ALLOWED_HOSTS if DEBUG if false

你会发现出错了,我们的程序中没有设置ALLOWED_HOSTS。加入你打网站是example.com,那么你应该只允许接收example.com这个客户端发送过来的请求,如果ALLOWED_HOSTS环境没有设置的话,就只允许localhost访问:

  1. import os
  2. import sys
  3. from django.conf import settings
  4. DEBUG = os.environ.get('DEBUG', 'on') == 'on'
  5. SECRET_KEY = os.environ.get('SECRET_KEY', os.urandom(32))
  6. #添加ALLOWED_HOSTS设置
  7. ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS','localhost').split('.')
  8. settings.configure(
  9. DEBUG=DEBUG
  10. , SECRET_KEY=SECRET_KEY
  11. , ROOT_URL_CONF=__name__
  12. , MIDDLEWARE_CLASSES=(
  13. 'django.middleware.common.CommonMiddleware',
  14. 'django.middleware.csrf.CsrfViewMiddleware',
  15. 'django.middleware.clickjacking.XFrameOptionsMiddleware'
  16. ),
  17. )

这该我们提供了一种通过修改环境变量来改变设置的方式。我们可以用unset命令来去掉环境变量

  1. hunter@hunter:~$ unset DEBUG

模板复用

目前为止,我们的项目集中在重新考虑通过startproject命令自动创建的文件布局上了。这条命令也可以允许你指定一个模板来提供布局,startproject创建的模板是一个目录或者压缩文件当命令运行时会把这个目录或者压缩文件渲染为template.渲染时会将project_name,project_directory,secret_keydocs_verson这四个变量渲染进去。我们把hello.py文件转换为一个项目模板,里面的一些相关部分要替换为变量,这里把密钥的值替换为secret_key

  1. import os
  2. import sys
  3. from django.conf import settings
  4. DEBUG = os.environ.get('DEBUG', 'on') == 'on'
  5. SECRET_KEY = os.environ.get('SECRET_KEY', '{{ secret_key }} ')
  6. ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', 'localhost').split('.')
  7. settings.configure(
  8. DEBUG=DEBUG
  9. , SECRET_KEY=SECRET_KEY
  10. , ROOT_URL_CONF=__name__
  11. , MIDDLEWARE_CLASSES=(
  12. 'django.middleware.common.CommonMiddleware',
  13. 'django.middleware.csrf.CsrfViewMiddleware',
  14. 'django.middleware.clickjacking.XFrameOptionsMiddleware'
  15. ),
  16. )
  17. from django.conf.urls import url
  18. from django.core.wsgi import get_wsgi_application
  19. from django.http import HttpResponse
  20. def index(request):
  21. return HttpResponse('Hello world')
  22. urlpatterns = (
  23. url(r'^$', index),
  24. )
  25. application = get_wsgi_application()
  26. if __name__ == '__main__':
  27. from django.core.management import execute_from_command_line
  28. execute_from_command_line(sys.argv)

现在,我们把文件保存为project_name.py放到一个project_name的目录中,比如 hello 项目:

  1. hello/
  2. project_name/
  3. project_name.py

接着运行下面命令

  1. django-admin.py startproject hello --template=project_name

运行和目录如下:

  1. hello/
  2. project_name/
  3. project_name.py
  4. hello/
  5. hello.py

如之前的例子一样,我们可以不用startprojecct命令来创建我们的项目,自动生成的文件布局并不是适合所有的项目,--template这个参数选项你可以使用也可不使用。
Django内置的有一个模板引擎,和关系对象映射(ORM),并且免费使用。这些你可以使用,也可自己扩展,这些都是自由的。下一章我们会扩展单文件例子,提供一个简单的HTTP服务以及使用更多的内置工具。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注