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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>What is your name?</h1>
    <h1>`name`</h1>
    <h1>`age`</h1>
</body>
</html>


还可以在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