1.安装Django,网站下载Django,https://www.djangoproject.com/download/,解压到python安装目录,用CMD进入django目录,输入 python setup.py install
2.创建Django本地项目,将C:Python27Libsite-packagesdjangoin加入环境变量,新建一个文件夹DjangoDemo(命名可以随便的),CMD进入新建文件夹, 输入
django-admin.py startproject mysite 即新建了一个Django 项目
3.Django文件架构:
setting文件用于项目的参数设置,例如debug,urls用于声明url对应的函数,views用于储存urls中url对应的函数,__init__.py一般为空,不需要修改。
cmd中输入
>python manage.py runserver
运行服务器
4.urls文件说明
from django.conf.urls import patterns, include, url from django.contrib import admin #admin.autodiscover() 这句不知道有什么用 import views urlpatterns = patterns('', (r'^$', views.hello), (r'^%', views.hello1), (r'^$', views.hello1 )) #当访问http://127.0.0.1:8000/hello是程序会运行views里面的hello函数,‘hello’是一个正则表达式
一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。 从现在开始,本文所有URL模式都用原始字符串
5.views文件说明
from django.http import HttpResponse def hello(request): return HttpResponse("hello world") def hello1(request): return HttpResponse("hello world1")
函数必须有一个参数request,可以通过这个类访问http请求相关的数据,例如参数,路径等
6.从url中提取数据
#urls.py中的代码 (r'^num/(d+)$', printNum), #views.py中的代码 def printNum(request,num): return HttpResponse("hello i am %s"%num)
效果为访问http://127.0.0.1:8000/num/252 会返回hello i am 252
正则表达式中可以通过()来提取数据,(r'^num/(d+)$', printNum),会提取括号里面的数据作为printNum中的一个参数,所以printNum有两个参数
7.模板
需要在setting.py文件中添加模板路径
TEMPLATE_DIRS = ( './mysite/t/', )#.代表manage.py所在的目录
views.py中的代码为:
def hello(request): return render_to_response('hello.html', {'list1':[1,2,5,4]})
html:
<html> <body> hello world {%for i in list1%} {{i}} {%endfor%} </body> </html>
一个网上的html代码demo:
<html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }},</p> <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if ordered_warranty %} <p>Your warranty information will be included in the packaging.</p> {% else %} <p>You didn't order a warranty, so you're on your own when the products inevitably stop working.</p> {% endif %} <p>Sincerely,<br />{{ company }}</p> </body> </html>
语句要加空格
names=['zhangsan','lisi'] name_age={'zhangsan':45,'lisi':78,'wangwu':75} for name in names: print name,name_age[name]
模版
#python语句 names=['zhangsan','lisi'] name_age={'zhangsan':45,'lisi':78,'wangwu':75} persons=[{'name':name,'age':name_age[name]} for name in names] #模版语句 {% for person in persons %} <p>{{person.name}}</p> <p>{{person.agent}}</p>
Python 的“真值”
在Python和Django模板系统中,以下这些对象相当于布尔值的False
-
空列表([] 空元组(() ) 空字典({} ) 空字符串('' ) 零值(0 ) 特殊对象None 对象False(很明显)
-
提示:你也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。
除以上几点以外的所有东西都视为`` True``
模板继承
一般网站中的html都有一般分时固定的,例如导航栏,导入相应css,js文件等,django中可以用模板继承来实现
先新建一个基础模板base.html
<html> <body> hello world {%block content%} {%endblock%} hello world {%block time%} {%endblock%} </body> </html>
再建一个子模板child1.html:
{% extends "base.html"%}
{% block content%}i am content from child1{%endblock%}
{% block time%} i am time from child2{%endblock%}
views中的函数:
def hello1(request): return render_to_response('child1.html' )
这样返回的结果为:
<html><head></head><body> hello world i am content from child1 hello world i am time from child2 </body></html>
8.表单
属性/方法 | 说明 | 举例 |
---|---|---|
request.path | 除域名以外的请求路径,以正斜杠开头 | "/hello/" |
request.get_host() | 主机名(比如,通常所说的域名) | "127.0.0.1:8000" or "www.example.com" |
request.get_full_path() | 请求路径,可能包含查询字符串 | "/hello/?print=true" |
request.is_secure() | 如果通过HTTPS访问,则此方法返回True, 否则返回False | True 或者 False |
HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)
除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息: request.GET 和 request.POST。二者都是类字典对象,可以通过它们来访问GET和POST数据。
form类
django中通过request,如request.POST["key1"]获取数据,如果不存在key1这个值,django会跳出异常,所以对于每一个key,都需要这样写:
if "key1" in request.POST: key1=request.POST["key1"]
以防止跳出异常,但是如果key非常多的时候,这样就很麻烦,所以django就引入form类
1)创建一个form类,在views.py文件的同级目录下,创建form.py
from django import forms class demoForm(forms.Form): name=forms.CharField() age=forms.NumberInput() fav=forms.CharField()
这里声明了三个字段,可以在每个字段的声明中加入参数, required=False,表示不是必须的,max_length=100,表示最大长度为100,,等等
2.判断form是否合乎规则
form = demoForm(request.POST) if form.is_valid(): name=request.POST["name"]
form.is_valid()方法会判断form是否合乎规则,是就返回True
2.自定义校验规则
例如需要指定age的长度要小于3,就需要在demoForm类下加入方法,clean_age(),如果合乎规则,就返回age,否则抛出异常。校验规则的方法必须以clean_开头。(为什么是clean,跟检验有什么关系吗?)
def clean_age(self): age= self.cleaned_data[age] agel = len(age.split()) if agel< 3: raise forms.ValidationError("age too old!") return age
9.会话与认证
cookies
request.COOKIES
response.set_cookie("mycookies", "eeee")
session
request.session["fav_color"] = "blue" 设置SESSION
fav_color = request.session["fav_color"] 获取SESSION
del request.session["fav_color"] 删除SESSION
def setsession(request): request.session["name"]="kevin" return HttpResponse("done") def getsession(request): name=request.session["name"] return HttpResponse(name)
10.重定向
from django.http import HttpResponseRedirect return HttpResponseRedirect("/get_server")
11.视图高级用法
from django.conf.urls.defaults import * urlpatterns = patterns('mysite.views', (r'^hello/$', 'hello'), (r'^time/$', 'current_datetime'), (r'^time/plus/(d{1,2})/$', 'hours_ahead'), ) urlpatterns += patterns('weblog.views', (r'^tag/(w+)/$', 'tag'), )
12.静态文件的配置方法,
由于Django每个版本的静态文件配置方法都不同(我也是醉了。。。),所以需要根据项目使用的版本来选择配置方法,详情参考:
http://my.oschina.net/u/877170/blog/293613