响应包括网页和JSON数据,而网页又包括重定向和错误视图。

url配置

配置流程:

1.制定根级url配置文件(setting.py文件中的ROOT_URLCONF = ‘project.urls’,一般不用修改)

2.urlpatterns(一个url实例列表和url对象(正则表达式、视图名称、名称))

匹配正则的注意事项:

1.如果想要从url中获取一个值,需要对正则加小括号

2.匹配正则前不需要加反斜杆

3.正则前要加r表示字符串不转义

引入其他url配置:

在应用目录中创建urls.py文件,定义本应用的url配置,在工程目录下的urls.py文件中使用include()方法

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('myapp.urls'))
]

url反向解析:

概述:如果在视图、模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址

解决:在使用链接时,通过url配置的名称,动态生成url地址

作用:使用url模板

视图函数

定义视图:

视图的本质是一个函数

视图参数:1.一个HttpRequest的实例(浏览器发送的内容) 2.通过正则表达式获取的参数

位置:一般在views.py文件下定义

错误视图:404视图(找不到网页时返回即url匹配不成功,在templates目录下定义404.html request_path是导致错误的网址)、400视图(错误出现在客户的操作 爬虫 cookie等)、500视图(在视图代码中出现错误(服务器diamante))等

配置settings.py:

DEBUG = True #为True表示永远不会调用404.html页面 404.html一定要写在templates目录下而不是myapp目录下
ALLOWED_HOSTS = ['*']

HTTPRequest对象

概述:服务器接收到htpp请求后会根据报文创建HTTPRequestt对象,视图的第一个参数就是HttpRequest对象,是由Django创建的,之后调用视图时传递给视图

属性:

path:请求的完整路径(但不包括域名和端口)

method:请求的方式,常用的有GET、POST

encoding:浏览器提交的数据编码方式

GET:类似于字典的对象,包含了get请求的所有参数(其实就是?a=45&b=dsaf那些)

POST:类似字典的对象,包含了post请求的所有参数(表单数据)

FILES:类似字典的对象,包含了所有上传的文件

COOKIES:字典,包含了所有的cookie

session:类似字典的对象,表示当前会话

方法:is_ajax():如果是通过XMLHTTPRequest发起的,返回True 如果是ajax,一般返回的是json数据

QueryDict对象

request对象中的GET、POST都属于QueryDict对象

方法:

get():根据键获取值,只能获取一个值

getlist():将键的值以列表的形式返回,可以获取多个值

GET属性

#urls.py
url(r'^get1',views.get1)
url(r'^get2',views.get2)
#views.py
def get1(request):
a=request.GET.get('a')
b=request.GET.get('b')
c=request.GET.get('c')
return HttpResponse(a+" "+b+" "+c)
def get2(request):
a = request.GET.getlist('a')
a0=a[0]
a1=a[1]
c = request.GET.get('c')
return HttpResponse(a0 + " " + a1 + " " + c)

POST属性

//regist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="regist/" method="post">
姓名:<input type="text" name="name" value=""/>
<hr/>
性别:<input type="radio" name="gender" value="1"/>
<input type="radio" name="gender" value="0"/>
<hr/>
年龄:<input type="text" name="age" value=""/>
<hr/>
爱好:<input type="checkbox" name="hobby" value="money"/>金钱
<input type="checkbox" name="hobby" value="girl"/>美女
<hr/>
<input type="submit" value="注册">
</form>
</body>
</html>
#关闭csrf 即注释掉 否则点击注册后会因为跨站攻击添加的网址内容位置不正确
#视频似乎有错误 并没有解决问题
1MIDDLEWARE = [
'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',
]
#POST
def showregist(request):
return render(request,'myapp/regist.html')

def regist(request):
name=request.POST.get("name")
gender=request.POST.get("gender")
age=request.POST.get("age")
hobby=request.POST.getlist("hobby")
print(name)
print(gender)
print(age)
print(hobby)
return HttpResponse("post")

HttpResponse对象

render方法:

原型:render(request,templateName,[,context])

属性:

content:表示返回的内容

charset:编码格式

status_code:响应状态码

content-type:指定输出的MIME类型

方法:

init:使用页面内容实例化HttpResponse对象

write:以文件形式写入

flush:以文件形式输出缓冲区

set_cookie(key,value=’’,max_age=None,expirses=None):设置cookie

delete_cookie(key):删除cookie 如果删除不存在的key,就当什么都没发生

子类HttpResponseRedirect

#views.py
#重定向 输入1的时候跳转到2的页面
from django.http import HttpResponseRedirect
def redirect1(request):
return HttpResponseRedirect('/redirect2')

def redirect2(request):
return HttpResponse("我是重定向后的视图")
#简写 redirect方法
from django.shortcuts import redirect
def redirect1(request):
return redirect('/redirect2')

def redirect2(request):
return HttpResponse("我是重定向后的视图")

子类JsonResponse

返回json数据,一般用于异步请求(ajax)

data:字典对象

注意:Content-type类型为application/json

状态保持

概述:http协议是无状态协议,每次请求都是一次新的请求,不记得以前的请求(登录状态没有记录);客户端与服务器端的一次通信就是一次会话;实现状态保持,在客户端或者服务器端存储有关会话的数据;

存储方式:cookie(不适用cookie原因:所有数据存储在客户端,不要存敏感的数据)或session(所有数据存储在服务器端,在客户端用cookie存储session_id,对应的值存储在服务器端)

目的:在一段时间内跟踪请求者的状态,可以使用跨页面访问当前请求者的数据

注意:不同的请求者之间不会共享这个数据,与请求者一一对应

启用session:默认启用

#settings.py
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
...
]

使用session:

启用session后,每个HTTPRequest对象都有一个session属性,就是一个类似字典的对象

get(key,default=None):根据键获取session值

clear():清空所有会话

flush():删除当前会话并删除会话的cookie

//login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/showmain/" method="post">
<input type="text" name="username"/>
<input type="submit" value="登录">
</form>
</body>
</html>

用到的数据:

insert into myapp_grades(gname,gdate,ggirlnum,gboynum,isDelete) values(“python01”,”2017-2-4”,10,50,0),(“python02”,”2017-5-4”,10,20,0),(“python03”,”2018-8-5”,50,50,0),(“python04”,”2018-6-15”,10,42,0);

insert into myapp_students(sname,sgender,scontend,isDelete,sgrade_id,sage) values(“蔡徐坤”,0,”我叫蔡徐坤”,0,4,20),

(“刘德华”,0,”我叫刘德华”,0,1,25),

(“陈瑞豪”,0,”我叫陈瑞豪”,0,3,18),

(“黑雪姬”,1,”我叫黑雪姬”,0,2,14),

(“有田春雪”,0,”我叫有田春雪”,0,2,13);


Shiroha