django基础-mtb开发模式&urls模块&views模块
mtv模式
mvc
M   模型
V   视图
C   控制器
django是mtv模式
M   模型(ORM)
T   模板,页面展示给用户
V   视图
URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template
访问过程
- Web服务器(中间件)收到一个http请求
- Django在URLconf里查找对应的视图(View)函数来处理http请求
- 视图函数调用相应的数据模型来存取数据、调用相应的模板向用户展示页面
- 视图函数处理结束后返回一个http的响应给Web服务器
- Web服务器将响应发送给客户端
对应的python文件如下
中间件可以在settings.py中MIDDLEWARE配置
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
urls.py
路由分发器
配置文件中
settings.py中ROOT_URLCONF设置根分发器
ROOT_URLCONF = 'hello_django.urls'
是django网站的url目录
写url方式
可以使用两种方式定义
#列表方式
urlpatterns = [
    url(r'^hello/$', views.hello),
]
#patterns方法
urlpatterns = ('',
    (r'^hello/$',views.hello),
)
参数
urlpatterns = [
    url(正则表达式, view函数, 参数, 别名, 前缀),
]
参数说明
- 正则表达式:正则表达式
- view函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:一个可选的name参数
- 前缀:路径前缀
view函数也可以是字符串形式,但是已经废弃
urlpatterns = [
    url(r'^hello/$', 'hello.views.hello'),
]
如果加参数,在调用的view.py中也要定义这个参数,而且两者的名字要一致,否则会报错
urlpatterns = [
    url(r'^hello/$', 'hello.views.hello',{'a':'a'}),
]
def hello(request,a):
    user_list = User.objects.all()
    return render(request,'table.html',{'user_list':user_list})
分解器
include
常见写法
url(r'test/\d{2}/$', views.test)  # test/66
url(r'test/(?P<id>\d{2})/$', views.test)
url(r'test2/(?P<id>\d{2})/(?P<key>\w+) /$', views.test)
url中定义了(?P
views.py
参考:http://iluoxuan.iteye.com/blog/1738522
request和resonse是两个核心
http请求中会产生这两个
请求:HttpRequest
相应:HttpResponse
HttpRequest
所有的views请求处理函数,第一对象都是用HttpRequest
def hello(request):
    print (isinstance(request, HttpRequest))
    user_list = User.objects.all()
    return render(request,'table.html',{'user_list':user_list})
HttpRequest对象属性
path		#
method      #方法的的类型
GET			#get参数字典,参考QueryDict
POST        #post参数字典
REQUEST     #post和get融合的字典,先查找post后查找get
COOKIES     #cookis字典,kv都是字符串
FILES
#所有上传文件的字典对象key是<input type="file" name="" /> 中name的值,value也是一个字典对象
#filename: 上传文件名,用Python字符串表示
#content-type: 上传文件的Content type
#content: 上传文件的原始内容
#只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据
META所有可用http头信息的字典
#原始内容
CONTENT_LENGTH
CONTENT_TYPE
QUERY_STRING: 未解析的原始查询字符串
REMOTE_ADDR: 客户端IP地址
REMOTE_HOST: 客户端主机名
SERVER_NAME: 服务器主机名
SERVER_PORT: 服务器端口
#字典中内容
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_HOST: 客户发送的HTTP主机头信息
HTTP_REFERER: referring页
HTTP_USER_AGENT: 客户端的user-agent字符串
HTTP_X_BENDER: X-Bender头信息
user关于用户和认证,只有激活django中的AuthenticationMiddleware才可用
是django.contrib.auth.models.User对象,代表当前登录永不
如果没有登录,则user初始化为django.contrib.auth.models.AnonymousUser对象
可用通过user.is_authenticated()判断用户是否登录
session             #唯一可读写的对象,会话字典,激活django的session支持才能用    
raw_post_data       #原始的HTTP POST数据,未被解析过
HttpRequest对象方法
Method                  Description
__getitem__(key)        #返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。
has_key()               #检查request.GET or request.POST中是否包含参数指定的Key。
get_full_path()         #返回包含查询字符串的请求路径
is_secure()             #如果请求是安全的,返回True,就是说,发出的是HTTPS请求。
QueryDict对象
HttpRequest的GET和POST属性是django.http.QueryDict类的实例,QueryDict可处理单key对多个值的情况
form中的<selectmultiple="multiple">就会传递多个value给一个key
QueryDict对象是immutable,除非创建它们的copy(),因此无法该表POST和GET的属性
字典方法不同实现
__getitem__                 #如果value多个值,返回最后一个
__setitem__                 #设置key的value列表,只能在mutable QueryDict上调用
get()                       #如果多个值,返回最后一个
update()                    #添加字典的items而不是替代
items()                     #单值__getitem__()
values()                    #单值__getitem__()
特有方法
copy()                      #返回对象的拷贝copy.deepcopy()
getlist(key)                #返回list对应的所有值
setlist(key,list_)          #设置key的值为list_ (unlike __setitem__())
appendlist(key,item)        #添加item到和key关联的内部list
setlistdefault(key,list)    #和setdefault有一点不同,它接受list而不是单个value作为参数
lists()                     #返回key所有值,作为一个list
urlencode()                 #返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5").
例子
<form action="/foo/bar/" method="post">
<input type="text" name="your_name" />
<select multiple="multiple" name="bands"> 
   <option value="beatles">The Beatles</option>
    <option value="who">The Who</option>
    <option value="zombies">The Zombies</option>
</select>
<input type="submit" />
</form>
如果用户在your_name域中输入"JohnSmith",同时在多选框中选择了“The Beatles”和“The Zombies”,下面是Django请求对象的内容:
>>> request.GET{}
>>> request.POST
{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}
>>> request.POST['your_name']
'John Smith' 
>>> request.POST['bands']
'zombies'
>>> request.POST.getlist('bands')
['beatles', 'zombies']
>>> request.POST.get('your_name', 'Adrian')
'John Smith'
>>> request.POST.get('nonexistent_field', 'Nowhere Man')
'Nowhere Man'
验证post提交,这样会出现403错误
<form method="post" action="/hello/">
    <input type="text" value="" name="key">
    <input type="submit" value="提交">
</form>
HttpResponse
HttpRequest对象由django自动创建,HttpResponse对象需要自己创建,每个View方法必须返回一个HttpResponse对象
- render方法就是返回了HttpResponse对象
- render是一种快捷的方法,也可以自动构造HttpResponse
- render_to_response方法返回(更简洁)
redirect进行跳转,在views.py函数的反除调用如下
return redirect('/test/')
return redirect('www.baidu.com')
HttpResponseRedirect
HttpResponsePermanentRedirect
HttpResponseNotModified
HttpResponseBadRequest
HttpResponseNotFound
HttpResponseForbidden
HttpResponseNotAllowed
HttpResponseGone
HttpResponseServerError
locals
以前返回值不需要自己去构造词典,将全部变量传递给模板,包括自己定义和系统定义的
render_to_response('table.html),locals()) #简化,稍浪费流量
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号