网站优化 推广,wordpress局域网外网访问不了,杭州的做网站公司,网站展示怎么做HttpRequests对象
利用http协议向服务器传参的4种途径
提取url特定部分#xff0c;如/web/index/#xff0c;可以通过在服务器端的路由中用正则表达式截取查询字符串#xff0c;形如?key1valuekeyvalue2#xff0c;#xff08;#xff1f;前面是路由#xff0c;…HttpRequests对象
利用http协议向服务器传参的4种途径
提取url特定部分如/web/index/可以通过在服务器端的路由中用正则表达式截取查询字符串形如?key1valuekeyvalue2前面是路由后面是字符串在请求体body中发送数据比如表单数据json、xml在http报文的头header中
url路径参数
如果想从url中获取参数值例如http://127.0.0.1/index/file
更改路由匹配为占位符用来接收请求中的参数
urlpatterns [path(path_name/file_name/,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?keyvaluekeyvalue
url以分割为两部分。前面是请求路径后边是查询字符串类似于字典多个值用拼接
可以使用request.GET来获取返回的是一个QueryDict字典这个字典和python中的字典不同。
这个字典可以一键多值但是也可以使用python字典的方法来处理
使用字典的get方法获取字典键的值
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request,path_name,file_name):query_strrequest.GETdata1query_str.get(key1)data2query_str.get(key2)print(query_str)print(data1)print(data2)QueryDict: {key1: [file_name], key2: [file_type]}file_namefile_typereturn HttpResponse(请求的资源路径是/%s/%s%(path_name,file_name))
使用字典getlist方法获取一个键的多个值返回一个列表
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request,path_name,file_name):query_strrequest.GETdata_listquery_str.getlist(key1)print(query_str)print(data_list)QueryDict: {key1: [file_name, file_path], key2: [file_type]}[file_name, file_path]return HttpResponse(请求的资源路径是/%s/%s%(path_name,file_name))
在请求体中发送数据
传递from表单数据
使用postman发送一个post请求发现状态码是403django默认是对post请求验证的 下面修改setting.py中的配置代码跳过对post请求的验证 使用POST方法接收请求体中的参数 json数据请求和接收
使用postman发送json数据 使用body方法来接收json数据接收到的数据是二进制的需要转成字符串然后再使用json的loads方法转成puthon中的字典 将字符串转换成字典
请求头
可以通过request.META属性获取请求头headers中的数据request.META为字典类型
其他的HttpsRequest对象属性
method一个字符串表示请求使用的HTTP方法常用值包括“GET”、POSTuser请求的用户对象path一个字符串表示请求的页面的完整路径不包含域名和参数部分encoding一个字符串表示提交的数据的编码方式 如果为None表示使用浏览器的默认设置一般为utf-8属性值是可以更改的可以通过修改它来修改访问表单数据使用的编码FILES一个类似于字典的对象包含所有的上传文件 转换器
作用验证请求路径中的参数
在视图函数中添加判断验证代码复用低转换器代码复用高 自定义一个转换器 from django.urls import path
from test_apps.views import index,registerfrom 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(int:path_name/phone:phone_num/,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(int:path_name/phone:phone_num/,index ),path(register,register),# path(json,json)
]
HttpResponse对象
使用django.htrtp.HttpResponse来构造响应对象
HttpResponse(content响应体content_type响应体数据类型status状态码)
响应状态码
分类
状态码分类说明1XX响应中--临时状态码表示请求已经接受告诉客户端应该继续请求或者如果它已经完成则忽略它2XX成功--表示请求已经被成功接受处理已完成3XX重定向--重定向到其他地方让客户端再发起一个请求以完成整个处理4XX客户端错误--处理发生错误责任在客户端如客户端的请求一个不存在的资源客户端未被授权禁止访问等5XX服务器端错误--处理发生错误责任在服务器端如服务端抛出异常路由出错HTTP版本不支持等
常见状态码
状态码英文描述解释200OK客户端请求成功即处理成功302Found只是所请求的资源已移动到由Location响应头给定的URL浏览器会自动重新访问到这个页面304Not Modified告诉客户端你请求的资源至上次取得后服务端并未更改你直接用你本地缓存吧。隐式重定向400Bad Request客户端请求有语法错误不能被服务器所理解403Forbidden服务器收到请求但是拒绝提供服务比如没有权限访问相关资源404Not Found请求资源不存在一般是URL输入有误或者网站资源被删除了428Precondition Required服务器要求有条件的请求告诉客户端要想访问资源必须携带特定的请求头429Too Many Requests太多请求可以限制客户端请求某个资源的数量配合Retry-After多长时间后可以请求响应头一起使用431Request Header Fields Too Large请求头太大服务器不愿意处理请求因为它的头部字段太大。请求可以在减少请求头域的大小后提交405Method Not Allowed请求方式有误比如应该用GET请求方式的资源而用了POST500Internal Server Error服务器发生不可预期的错误表示服务器出异常了503Service Unavailable服务器尚未准备好处理请求比如服务器刚刚启动还未初始化好511 Network Authentication Required 客户端需要进行身份验证才能获得网络访问权限
响应头可以直接将HttpResponse对象当作字典进行响应头键值对的设置
responseHttpResponse()
# 自定义响应头name值为python
respone[name]python
JsonrResponse 将字典直接转换成json字符串
def json_response(request):info{name:小明,age:18}return JsonResponse(datainfo) 将其他类型的数据转换成json字符串 def json_response(request):info[{name: 小明,age: 18},{name:王刚,age:20}]return JsonResponse(datainfo,safeFalse)
重定向
from django.shortcuts import redirect
def redirects(request):return redirect(http://www.baidu.com)
状态保持
cookie客户端存储信息session服务端存储信息
cookie
cookie以键值对的格式进行信息的存储cookie基于域名安全不同域名的cookie是不能互相访问的当浏览器请求某网站时会将浏览器存储的跟网站相关的所有cookie信息提交给网站服务器 第一次请求携带查询字符串
服务器收到请求之后获取username服务器设置cookie信息cookie信息包括username
浏览器接收到服务器的响应后应该把cookie保存起来第二次及其以后的请求都会携带cookie信息服务器就可以读取cookie信息用来判断用户身份def set_cookie(request):# 查询字符串数据namerequest.GET.get(username)# 服务器设置cookie信息# 通过响应对象.set_cookie方法responseHttpResponse(name)# .set_cookie方法将数据存放在本地cookie中通过.COOKIES获取response.set_cookie(name,name)return responsedef get_cookie(request):# {name: xiaoming},requset.COOKIES返回的是一个字典数据namerequest.COOKIES.get(name)# 将数据直接返回return HttpResponse(name)
设置cookie到期时间
# max_age 是一个秒数从响应开始计数的一个秒数
response.set_cookie(name,name,max_age60*60)
删除cookie
# 原理是将cookie有效期设置为0
request.delete_cookie(name)
session
修改数据库中的sessionid浏览器将找不到数据。
通过resquest.session的方式设置session
session保存在服务器session需要依赖于cookiesession存储于数据库中 设置一个session 第一次请求服务器端设置session信息
服务器同时会生成一个sessionid的cookie的信息
浏览器接收到这个信息后会把cookie数据保存起来第二次及其以后的请求都会携带这个sessionid服务器会验证这个sessionid
验证没有问题会读取相关数据实现业务逻辑def set_session(request):# 1、获取用户信息namerequest.GET.get(username)# 2、设置session信息request.session[username]namereturn HttpResponse(set_session)
数据库中会被添加一条数据 获取session
def get_session(request):namerequest.session.get(username)pswrequest.session.get(password)content{},{}.format(name,psw)return HttpResponse(content) session 保存到redis具体使用参考官方文档
安装扩展
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_ENGINEdjango.contrib.sessions.backends.cache
# 指定缓存配置信息
SESSION_CACHE_ALIASdefault session过期与删除
清除所有session在存储中的值部分
request.session.clear()
清除session数据在存储中删除session的整条数据
request.session.flush()
删除session中的指定键值在存储中只删除某个键及对应值
del request.session[键]
设置session的有效期
如果value是一个整数session将在value秒没有活动后过期如果value为0那么用户session的cookie将在用户的浏览器关闭时过期如果valu为None那么session有效期将采用系统默认值默认为两周可以通过settings.py中设置SESSION_COOKIE_AGE来设置全局默认值
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 MiddlewareMixinclass 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,
]多个中间件的执行顺序
在请求视图被处理前中间件由上至下依次执行在请求视图被处理后中间件由下至上依次执行