如果想从url中获取参数值,例如:http://127.0.0.1/index/file
- urlpatterns = [
- path('
//' ,index ), - ]
- from django.shortcuts import render
- from django.http import HttpResponse
- # Create your views here.
- def index(request,path_name,file_name):
-
- return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

http://ip/path/path?key=value&key=value
url以?分割为两部分。?前面是请求路径,后边是查询字符串,类似于字典多个值用&拼接
可以使用request.GET来获取,返回的是一个QueryDict字典,这个字典和python中的字典不同。
这个字典可以一键多值,但是也可以使用python字典的方法来处理
- from django.shortcuts import render
- from django.http import HttpResponse
- # Create your views here.
- def index(request,path_name,file_name):
- query_str=request.GET
- data1=query_str.get("key1")
- data2=query_str.get("key2")
- print(query_str)
- print(data1)
- print(data2)
- """
-
- file_name
- file_type
- """
- return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))
- from django.shortcuts import render
- from django.http import HttpResponse
- # Create your views here.
- def index(request,path_name,file_name):
- query_str=request.GET
- data_list=query_str.getlist("key1")
- print(query_str)
- print(data_list)
- """
-
- ['file_name', 'file_path']
- """
- return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))
使用postman发送一个post请求,发现状态码是403,django默认是对post请求验证的

下面修改setting.py中的配置代码,跳过对post请求的验证

使用POST方法接收请求体中的参数


使用postman发送json数据

使用body方法来接收json数据,接收到的数据是二进制的,需要转成字符串然后再使用json的loads方法转成puthon中的字典
将字符串转换成字典
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型
其他的HttpsRequest对象属性

作用:验证请求路径中的参数


- from django.urls import path
- from test_apps.views import index,register
-
- from django.urls.converters import register_converter
-
-
- # 定义转换器
- class PhoneConverter:
- regex = '1[3-9]\d{9}'
-
- # 验证没有问题的数据,给视图函数
- def to_python(self, value):
- return int(value)
-
- # def to_url(self, value):
- # return str(value)
-
-
- # 注册转换器
- # def register_converter(converter, type_name):
- # converter 转换器类
- # type_name 转换器的名字
-
- register_converter(PhoneConverter,"phone")
-
- # 使用转换器
- urlpatterns = [
- path('
//' ,index ), - path('register',register),
- # path('json',json)
- ]
自定义一个转换器实现对手机号的验证
- # 定义转换器
- class PhoneConverter:
- regex = '1[3-9]\d{9}'
-
- # 验证没有问题的数据,给视图函数
- def to_python(self, value):
- return int(value)
-
- # def to_url(self, value):
- # return str(value)
- from django.urls.converters import register_converter
- # 注册转换器
- # def register_converter(converter, type_name):
- # converter 转换器类
- # type_name 转换器的名字
-
- register_converter(PhoneConverter,"phone")
- # 使用转换器
- urlpatterns = [
- path('
//' ,index ), - path('register',register),
- # path('json',json)
- ]
使用django.htrtp.HttpResponse来构造响应对象
HttpResponse(content=响应体,content_type=响应体数据类型,status=状态码)
| 状态码分类 | 说明 |
|---|---|
| 1XX | 响应中--临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
| 2XX | 成功--表示请求已经被成功接受,处理已完成 |
| 3XX | 重定向--重定向到其他地方(让客户端再发起一个请求以完成整个处理) |
| 4XX | 客户端错误--处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
| 5XX | 服务器端错误--处理发生错误,责任在服务器端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
| 状态码 | 英文描述 | 解释 |
|---|---|---|
| 200 | OK | 客户端请求成功,即处理成功 |
| 302 | Found | 只是所请求的资源已移动到由Location响应头给定的URL,浏览器会自动重新访问到这个页面 |
| 304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
| 400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
| 403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
| 404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 |
| 428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问资源,必须携带特定的请求头 |
| 429 | Too Many Requests | 太多请求,可以限制客户端请求某个资源的数量,配合Retry-After(多长时间后可以请求)响应头一起使用 |
| 431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后提交 |
| 405 | Method Not Allowed | 请求方式有误,比如:应该用GET请求方式的资源,而用了POST |
| 500 | Internal Server Error | 服务器发生不可预期的错误,表示服务器出异常了 |
| 503 | Service Unavailable | 服务器尚未准备好处理请求,比如:服务器刚刚启动,还未初始化好 |
| 511 | Network Authentication Required | 客户端需要进行身份验证才能获得网络访问权限 |
响应头可以直接将HttpResponse对象当作字典进行响应头键值对的设置
- response=HttpResponse()
- # 自定义响应头name,值为python
- respone["name"]="python"

将字典直接转换成json字符串
- def json_response(request):
- info={
- "name":"小明",
- "age":18
- }
- return JsonResponse(data=info)
将其他类型的数据转换成json字符串
- def json_response(request):
- info=[
- {
- "name": "小明",
- "age": 18
- },
- {
- "name":"王刚",
- "age":20
- }
- ]
- return JsonResponse(data=info,safe=False)
- from django.shortcuts import redirect
- def redirects(request):
- return redirect("http://www.baidu.com")

-
- """
- 第一次请求,携带查询字符串
- 服务器收到请求之后,获取username,服务器设置cookie信息,cookie信息包括username
- 浏览器接收到服务器的响应后,应该把cookie保存起来
- 第二次及其以后的请求,都会携带cookie信息,服务器就可以读取cookie信息,用来判断用户身份
- """
- def set_cookie(request):
- # 查询字符串数据
- name=request.GET.get("username")
- # 服务器设置cookie信息
- # 通过响应对象.set_cookie方法
- response=HttpResponse("name")
- # .set_cookie方法将数据存放在本地cookie中,通过.COOKIES获取
- response.set_cookie("name",name)
- return response
-
-
- def get_cookie(request):
- # {'name': 'xiaoming'},requset.COOKIES返回的是一个字典数据
- name=request.COOKIES.get("name")
- # 将数据直接返回
- return HttpResponse(name)
- # max_age= 是一个秒数,从响应开始计数的一个秒数
- response.set_cookie("name",name,max_age=60*60)
- # 原理是将cookie有效期设置为0
- request.delete_cookie("name")
修改数据库中的sessionid,浏览器将找不到数据。
通过resquest.session的方式设置session

设置一个session- """
- 第一次请求服务器端设置session信息
- 服务器同时会生成一个sessionid的cookie的信息
- 浏览器接收到这个信息后会把cookie数据保存起来
- 第二次及其以后的请求,都会携带这个sessionid,服务器会验证这个sessionid
- 验证没有问题会读取相关数据,实现业务逻辑
- """
- def set_session(request):
-
- # 1、获取用户信息
- name=request.GET.get("username")
- # 2、设置session信息
- request.session["username"]=name
- return HttpResponse("set_session")
数据库中会被添加一条数据
获取session - def get_session(request):
- name=request.session.get("username")
- psw=request.session.get("password")
- content="{},{}".format(name,psw)
- return HttpResponse(content)

安装扩展
pip install django-redis
在settings.py配置redis做session存储
- # cache缓存
- CACHES={
- # 默认配置
- 'default':{
- # 使用redis类实现缓存
- 'BACKEND':'django_redis.cache.RedisCache',
- 'LOCATION':'redis://127.0.0.1:6379/1', # 主机端口和库
- 'OPTIONS':{
- 'CLIENT_CLASS':'django_redis.client.DefaultClient',# 设置客户端
- }
- }
- }
- # 服务引擎,使用缓存
- SESSION_ENGINE='django.contrib.sessions.backends.cache'
- # 指定缓存配置信息
- SESSION_CACHE_ALIAS='default'

清除所有session,在存储中的值部分
request.session.clear()
清除session数据,在存储中删除session的整条数据
request.session.flush()
删除session中的指定键值,在存储中只删除某个键及对应值
del request.session['键']
设置session的有效期
request.session.set_expiry(value)

-
- """
- 类试图的定义
- class 类试图名字(View):
- def get(self,requset):
- return HttpResponse('xxx')
- def http_method_lower(self,request):
- return HttpResponse('xxx')
- """
- from django.views import View
- class My_View(View):
- def get(self,requset):
- return HttpResponse('get get get ')
-
- def post(self,request):
- return HttpResponse('post post post')
django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改django的输入输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了django框架的健壮性。
必须继承自MiddlewareMixin
- from django.utils.deprecation import MiddlewareMixin
-
- class TestMiddleware(MiddlewareMixin):
- def process_request(self,request):
- print("每次请求前调用")
-
- def process_response(self,request,response):
- print("每次响应前调用")
- return response
修改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',
- 'test_apps.middleware.TestMiddleware',
- ]