HttpRequest对象:
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API
属性 | 描述 |
---|---|
path | 一个字符串,表示请求页面的完整路径,不包含域名 |
method | 一个字符串,表示请求使用的http方法,常用值包括‘GET’,‘POST’ |
encoding | 一个字符串,表示提交数据的编码方式,如果为none,则表示使用浏览器的默认格式utf-8,这个属性是可写的,可以通过修改他来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值 |
GET | 一个类似字典的对象,包含get访问的所有参数 |
POST | 一个类似字典的对象,包含post访问的所有参数 |
FILES | 一个类似字典的对象,包含所有上传文件 |
COOKIES | 一个标准的python字典,包含所有cookie,键和值都是字符串。 |
session | 一个即可读,又可写的类似字典的对象,表示当前你的会话,只有当Django启用会话支持时才可用,详细内容见‘状态保持’ |
is_ajax() | 这是一个方法,不是属性,如果请求通过xmlHttpRequest发起的,则返回ture |
form标签中的‘GET’和‘POST’
在HTML中,form表单的作用是收集标签中的内容,
一个表单必须指定两样东西:
- form的method参数用于设置表单的提交方式,默认使用POST.
- action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
form action="{% url 'post_test' %}" method="POST">
{% csrf_token %}
form表单使用get方式提交的例子:
def get_test(request):
a = request.GET.get('a')
b = request.GET.get('b')
print(a,b)
return HttpResponse('数据请求成功')
可以看见在地址栏会显示参数。
form表单使用post方式提交的例子:
def post_test(request):
# a = request.POST.get('a')
a = request.POST.getlist('a') #当name有重名时使用getlist获取数据
# b = request.POST.get('b')
print(a)
return HttpResponse('数据请求成功')
一键多值的getlist方法:
request对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
- 方法get():
根据键获取值,只能获取键的一个值
如果一个键同时拥有多个值,获取最后一值 - 方法getlist():
根据键获取值将键的值以列表返回
可以获取一个键的多个值
request中GET和POST对象的属性:
GET属性:
- QueryDict类型的对象
- 包含get请求方式的所有参数
- 与url请求地址中的参数对应,位于?后面
- 参数的格式是键值对,如key1=value1
- 多个参数之间,使用&连接,如key1=value1&key2=value2
POST属性: - QueryDict类型的对象
- 包含post请求方式的所有参数
- 与form表单中的控件对应
- 表单中控件要有name属性,则name属性的值为键,value属性的值为值,构成键值对提交
- 对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况.
GET和POST请求方式总结:
- GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
- POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
- POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些.当然,也不能简单的判定POST方法比GET方法更安全,要使网站保持安全,需要做更多的安全处理.
类视图:
View类视图以请求方式为类方法.
在对应的方式下面编写对应的逻辑函数.
from django.views import View
class BlogAdd(View):
def get(self,request):
return render(request,'blog/blog_add.html')
def post(self,request):
title = request.POST.get('title')
content = request.POST.get('content')
print(title, content)
blog = BlogModel(title=title, zcontent=content)
blog.save()
return redirect(reverse('cls_add'))
就是将视图中的方法以类的方式书写逻辑。
View类视图的引用.
在url.py中配置路由是通过: as_view()
path('cls_add',views.BlogAdd.as_view(),name='cls_add'),
文件上传:
Django在处理文件上传的时候,文件数据被保存在了request.FILES,FILES中的每个键为中的name
设置文件的存储路径:
1.在项目根目录下static中创建media文件夹
2.图片上传后,会被保存到“/static/media/文件”
3.打开settings.py文件,增加media_root项
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static')
]
MEDIA_ROOT = [os.path.join(BASE_DIR,'static/media')]
FILES只有在请求的方法为POST 且提交的