django是众多python web框架之一, 相比其他的web框架, django本身集成了ORM 模型绑定 模板引擎 缓存 session 等功能.django一个全能型框架. 采用了MVC设计的模式.
安装
pip install Django==1.9.4
git clone https://github.com/django/django.git
或者下载源码包 进行安装
tar xf Django-1.7.11.tar.gz
cd Django-1.7.11
python setup.py install
django的几个命令
django-admin startproject websiteName # 创建站点
python manage.py startapp appName # 创建应用
python manage.py syncdb #生成数据库
python manage.py makemigrations #基于当前的model创建新的迁移策略文件
python manage.py migrate #执行迁移动作 ,migration是基于App的
python manage.py createsuperuser #闯将超级用户
python manage.py changepassword username 修改用户密码
python manage.py runserver 运行服务器
##我使用的环境 :ubuntu 14.04LTS + Python 2.7.6 + django(1, 8, 0, 'final', 0)
1. 创建django程序
django-admin startproject web
web 为项目名称
执行命令后在当前目录下会生成一个目录 目录结构如下:
tree web web ├── manage.py └── web ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
文件说明:
web 项目 目录(最上面的web,manage.py的父目录)
manage.py 用于管理django站点
__init__.py 告诉python,当前目录是一个python模块
setting.py 包含项目所有的配置参数
urls.py URL配置文件
wsgi.py 内置runserver命令的WSGI应用配置
注意 :在使用pycharm 去创建project的时候 还会产生一个 templates 名称的目录, templates目录一般用来放置模板文件.
2. 新建app
django-admin startapp app01
tree web/ web/ ├── app01 │ ├── admin.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py └── web ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
将新建的app加入到INSTALLED_APPS
vi setting.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', )
3. 设置views.py (视图)
vi app01/views.py # -*- coding:utf8 -*- from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("hello world!")
4 设置url
vi urls.py
from django.conf.urls import include, url from django.contrib import admin from app01 import views #导入视图 urlpatterns = [ # Examples: # url(r'^$', 'web.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^index/$', views.index), #设置url与 views中的函数的对应 ]
5. 启动服务
python manage.py runserver
默认只有本机可以访问,启动的端口是8000
如果需要和其他共同开发 还可以 这样启动服务
python manage.py runserver 0.0.0.0:8000
这样其他机器 也就可以访问你的django server了
访问
http://127.0.0.1:8000/index/
就可以看到我们的定义的函数返回的结果
hello world!
#####################################
通常我们不用关心python搜索路径的设置,python和django会自动帮我们处理
在配置 urlpatterns的时候 模式包含了 正则表达式符号 ^ 和 $ , 分别匹配开头和结尾
^hello/$ 匹配 一个地址, 那就是 地址李只包含 hello/ 的地址
^hello/ 匹配所有 以hello/ 开头的地址
helo/$ 匹配所有 以hello/ 结尾的地址
helo/ 匹配所有 包含 hello/ 的地址
在访问的时候,如果地址的结尾有 / 那么会被重定向到 没有/ 的同名地址
如 访问 index/ 的时候 会被重定向到 index
关于正则表达式
符号 匹配
. (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}匹配一个或两个或三个数字)
关于404 错误
在访问一个未定义的地址的时候 ,页面提示一个 " Page not found" 的错误
django处理请求的过程
运行 python manage.py runserver
在我们访问 http://127.0.0.1:8000/index 的时候
脚本会在manage.py的同级目录下查找 setting.py文件, 这个文件包含了django项目的所有配置信息 ,其中
ROOT_URLCONF = 'web.urls' 作为URLconf告诉django 在这个站点中哪些模块会被用到.
在我们访问 /index/ 的时候 ,django根据ROOT_URLCONF 加载URLconf ,然后按循序逐个匹配URLconf里的 URLpatterns ,直到找到匹配的项 . 找到匹配的项后, 就会调用和 该匹配项管理的view函数,并把HttpRequest 对象作为第一个参数. 然后view 返回一个HttpResponse . 最后django将HttpResponse 转换为一个HTTP Response ,并以web 页面显示出来
过程如下:
1 进来的请求 转入 /index/
2 django 通过 ROOT_URLCONF 配置来决定URLconf
3 django 在URLconf 的所有的URL模式中找到 匹配index的项
4 找到匹配项 ,调用对应的函数
5 视图函数返回一个HttpResponse
6 django将 HttpResponse转换为一个合适的 HTTP Response, 并以Web Page 显示出来
###############################################################
动态内容
添加一个 输出当前时间的 函数 并写入配置 ,并配置url
import datetime
def currentTime(request):
now = datetime.datetime.now()
return HttpResponse(now)
url(r'time/$', views.currentTime),
显示时间的时候 你会发现页面显示的时间会和你的本地时间有时差
这是因为django的默认时区为America/Chicago ,在1.8.X的版本里 的设置为
TIME_ZONE = 'UTC'
我们只要将该设置项设置为本地的 时区即可
TIME_ZONE = 'Asia/Shanghai'
###############################################################
动态url
如果我们要设置多个类似的url
比如
index/1
index/2
index/3
index/4
.......
如果url 数量少 ,我们可以手动设置,但是当url的数量成百上千的时候,如果我们还手动设置无疑会累死.
手动设置的时候是这个样子:
urlpatterns = patterns('',
url (r'^index/1/$', one),
url(r'^index/2/$', twod),
url(r'^index/3/$', three),
url(r'^index/4/$', four),
)
正确的方法应该是:
url(r'^index/(\d+)/$', views.dynamic),
def dynamic(request,args):
data= "Dynamic URL test:"+args
return HttpResponse(data)
然后访问对应的网址 页面的内容也会有相应的变化
###################################3
使用模板 展示html
关于模板 请参考: http://timesnotes.blog.51cto.com/1079212/1748411
http://www.cnblogs.com/wupeiqi/articles/5237704.html
使用html模板
前面我们已经可以实现客户端向服务端请求一个url,服务端返回一个HTTP Response 并在客户端的web Page中显示.
现在我们只要将想要的结果加入到html模板中即可
cat app01/view.py
from django.shortcuts import HttpResponse
from django.shortcuts import render
def home(request):
# return HttpResponse("ok")
dic = {"name":"allen","age":12}
return render(request,"home.html",dic)
cat templates/home.html
What is your name?
`name`
`age`
还可以在html文件中导入css/js文件
全部目录建立完后 目录结构为
.
├── app01
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── templatetags
│ │ ├── customDef.py
│ │ └── __init__.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
├── nsite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── static
│ ├── css
│ │ └── comm.css
│ ├── p_w_picpaths
│ ├── js
│ │ ├── jquery-2.2.0.js
│ │ └── jquery-2.2.0.min.js
│ └── plugins
│ └── bootstrap
│ ├── css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.css.map
│ │ ├── bootstrap-theme.min.css
│ │ └── mycss.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ └── js
│ ├── bootstrap.js
│ ├── bootstrap.min.js
│ ├── jquery-2.2.0.js
│ ├── jquery-2.2.0.min.js
│ ├── myjs.js
│ └── npm.js
└── templates
├── app01
│ └── app01index.html
├── include
│ └── include1.html
└── master
└── m1.html