一、Django 简介
Django 是一个由 Python 写成的开放源代码的 Web 应用框架。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统)软件。并于2005年7月在 BSD 许可证下发布。这套框架是以比利时的吉普赛爵士吉他手 Django Reinhardt 来命名的。由于 Django 的是在一个快节奏的新闻编辑室环境下开发的,它的目的是使常见的 Web 开发任务,快速和容易。
MTV 模式
Django采用了MTV设计模式
1.URL(urls.py)请求调度,当有缓存页面的时候直接返回内容。
2.视图函数(view.py)执行所请求的操作,通常包括读写数据库。
3.模型(models.py)定义了Python中的数据并与之交互。通常包含在一个关系数据库(MySQL、PostgreSQL SQLite等),其他数据存储是可能的(XML、文本文件、LDAP、等)。
4.请求执行任务后,视图返回一个HTTP响应对象(通常是经过数据处理的一个模板)。可选的:视图可以保存一个版本的HTTP响应对象,返回携带一个时间戳,来告诉浏览器这个视图的更新时间。
5.模板通常返回HTML页面。Django模板语言提供了HTML的语法及逻辑。
安装
# pip 安装 pip install Django==1.10 # 克隆下载最新版本 git clone https://github.com/django/django.git # 导入django模块 >>> import django >>> print(django.get_version()) 1.10
二、基本配置
1.常用命令
# 查看django版本 $ python -m django --version # 创建项目,名为mysite $ django-admin startproject mysite # 启动django $ python manage.py runserver $ python manage.py runserver 8080 $ python manage.py runserver 0.0.0.0:8000 # 创建应用程序,确保和 manage.py 是同一目录 $ python manage.py startapp polls # 运行创造模型变化迁移 $ python manage.py makemigrations # 运行应用模型变化到数据库 $ python manage.py migrate # admin创建管理员用户 $ python manage.py createsuperuser
注:自动重新加载 runserver,根据需要开发服务器自动重新加载Python代码为每个请求。您不需要重新启动服务器代码更改生效。然而,像添加文件某些操作不触发重新启动,所以你必须重新启动在这些情况下的服务器。
基本目录结构及作用
mysite/ # 项目的容器,名字随便起 manage.py # 命令行实用工具,以各种方式与该Django项目进行交互 mysite/ # 实际的Python项目 __init__.py # 空文件,导入不出错 settings.py # 这个Django项目配置 urls.py # 这个Django项目的URL声明; 一个Django驱动网站的“目录” wsgi.py # 一个入口点为WSGI兼容的Web服务器,以满足您的项目
2.配置文件
数据库
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
# 在settings 中修改DATABASES DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
模板
# 也在settings里修改,放html文件 TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), )
静态文件
# 依然在settings里修改添加,放css,js等文件 STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
三、路由系统
1.URL调整
一个干净,优雅的 URL 方案是一个高质量的 Web 应用程序的一个重要的细节。
与tornado不同的是一个 url 对应一个函数,而并非一个类。
像是一个新华字典的目录,对应了 views 函数来进行处理,即这个 url 要用某个指定的 views 函数处理。
来看以下示例,如何动态构造:
from app1 import views urlpatterns = [ url(r'^manage1/(d*)', views.manage1), url(r'^manage2/(?P<name>w*)/(?P<id>d*)', views.manage2), url(r'^manage3/(?P<name>w*)', views.manage3,{'id':333}), ] # 需要注意 # url多传了一个参数,那views函数得多接受一个参数
# 对应接收值 def manage1(request, age): print(age) # 18 return HttpResponse('1') def manage2(request, name, id): print(name, id) # nick 18 return HttpResponse('2') def manage3(request, name, id): print(name, id) # nick 666 return HttpResponse('3')
二级路由:那如果映射 url 太多怎么办,全写一个在 urlpatterns 显得繁琐,so 二级路由应用而生
# 一级路由规定 app1 开头的都去 app1.urls 中找 # 二级在详细规定对应 views 函数 # 一级 urlpatterns = [ url(r'^app1/', include('app1.urls')), ] # 二级 urlpatterns = [ url(r'^1$', views.manage1), ]
2.Django是如何处理一个请求
当用户请求从您的Django得网站页面,这是该系统遵循以确定哪些Python代码执行的算法:
1.Django请求是URL配置模块配置。通常通过值ROOT_URLCONF设置,但如果传入HttpRequest对象具有urlconf属性(由中间件设置),它的值将代替的可以使用ROOT_URLCONF的设置。
2.Django的负载时Python模块并寻找变量urlpatterns。这是一个django.conf.urls.url()实例。
3.Django的贯穿每个URL模式,从而,在所请求的URL匹配的第一个停止。
4.一旦某个正则表达式相匹配,就运行相对应的视图函数(或基于类的视图)。该视图被传递一下参数:
HttpRequest 对象。
如果匹配的正则表达式没有返回命名组,然后从正则表达式比赛是作为位置参数。
关键词参数是由由正则表达式匹配的任何命名组,由指定的可选参数的任何覆盖的 kwargs参数 django.conf.urls.url()。
5.如果没有正则表达式匹配,或者如果一个异常在这个过程中的任何一点时提出,Django的调用适当的错误处理视图。
3.官方示例
1.以下代码是官方示例:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
笔记注意事项:
要捕获从URL中的值,用括号括起来,会当参数传入views视图。
没有必要添加一个斜体,因为每个URL都有。例如,它^articles不是^/articles。
在'r'前面的每个正则表达式字符串中是可选的。但建议。它告诉Python字符串是“原始” -没有什么字符串中应该进行转义。
举例请求:
请求/articles/2005/03/将匹配列表中的第三项。Django的将调用该函数。views.month_archive(request,'2005','03')
/articles/2005/3/不会匹配任何URL模式,因为在列表中的第三项中需要两位数字的月份。
/articles/2003/将匹配的列表,而不是第二个第一个图案,因为该图案,以便测试,第一个是在第一测试通过。随意利用顺序插入特殊情况是这样的。在这里,Django的将调用该函数views.special_case_2003(request)
/articles/2003不匹配任何这些模式,因为每个模式要求URL以斜线结束。
/articles/2003/03/03/将匹配的最终格局。Django的将调用该函数。views.article_detail(request,'2003','03','03')
2.命名组
上面的例子使用了简单的,非命名的正则表达式组(通过括号)来捕获 URL 的位,并通过他们的位置参数的视图。在更高级的用法,它可以使用命名 正则表达式组来捕获 URL 位,将它们作为关键字参数传递给视图。
在Python正则表达式,命名正则表达式组的语法(?P<name>pattern),这里name是组的名称,pattern就是某种模式相匹配。
下面是上面的例子中的URLconf,改写使用命名组:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
这正好完成同样的事情,前面的例子,一个细微的差别:捕获的值传递给查看功能作为关键字参数,而不是位置参数。例如:
请求/articles/2005/03/会调用函数来代替,views.month_archive(request,year='2005',month='03')views.month_archive(request,'2005','03')
请求/articles/2003/03/03会调用该函数,views.article_detail(request,year='2003',month='03',day='03')
在实践中,这意味着你的 URLconf 稍微更明确,不容易参数顺序错误 - 你可以在你的意见'函数定义重新排序的参数。当然,这些优点来在简短的费用; 一些开发任务命名组的语法丑陋,太冗长。
匹配/分组算法
这里的URL配置解析器遵循算法,相对于正则表达式命名组与非命名组:
1.如果有任何命名参数,它会使用这些,而忽略非命名参数。
2.否则,它会通过所有菲命名参数作为位置参数。
在这两种情况下,被赋予按任何额外的关键字参数传递额外的选项来查看功能也将被传递给视图
3.捕获的参数总是字符串
每个捕获的参数发送到视图作为普通的 Python 字符串,无论什么样的匹配正则表达式匹配。
例如,在该URL配置行:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
...的year参数传递给views.year_archive()将是一个字符串,不是一个整数,即使[0-9](4)将只匹配整数字符串。
4.指定view的默认设置
一个方便的技巧是你的观点的论据指定默认参数。下面是一个例子的 RLconf 和看法:
# URLconf from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # View (in blog/views.py) def page(request, num="1"): # Output the appropriate page of blog entries, according to num. ...
在上述的例子中,两个 URL 模式指向同一个视图 views.page
但第一图案不捕获从 URL 任何东西。如果第一个模式匹配,该 page()
函数将使用它的默认参数 num
,"1"
。如果第二图案相匹配时,page()
将使用任何 num
值由正则表达式捕获。