1、图片的上传
案例:用户注册图片上传
1、设计模型
u_name 用户名
u_age 密码
u_img 头像
# 保存头像--本质上保存的是文件的路径
# 目录:static/upload/icon
# upload_to 表示指定图片上传的相对路径名,及文件上传的额路径的前缀
class User(models.Model):
u_name = models.CharField(max_length=50)
u_age = models.IntegerField(default=17)
u_img = models.ImageField(upload_to='icon')
注意:上传目录需要配置后才能使用
1、在static目录下创建文件上传放置目录upload
2、在setting中配置
在setting的后面追加:
MEDIA_ROOT = os.path.join(BASE_DIR,'static/upload')
2、表单
1、上传文件的标签:
头像:<input type="file" name="img">
2、表单提交需要用post请求,还需要设置数据的编码类型
<form action="{% url 'doimgupload' %}" method="post" enctype="multipart/form-data">
3、服务器处理:
1、文件的接收
# 获取文件数据
data = request.FILES.get("key")
2、保存到数据库
user.u_img = data 直接设置file获取的值即可,django会自动的处理
4、展示数据库存储的图片
def getImg(request):
# 获取头像
user = User.objects.filter(u_name='玛花').first()
# 获取图片的路径
imgPath = '/static/upload/'+ user.u_img.url
data = {
'imgPath':imgPath
}
return render(request,'getimg.html',context=data)
2、自定义文件上传
def doimgUpload(request):
# 获得文件
uploadFile = request.FILES.get('img')
# 文件的写入操作
# 服务器文件的名字通常唯一的
#设置文件名及上传路径
filePath = os.path.join(settings.MEDIA_ROOT,createFileName()+'.jpg')
# 以写的方式打开文件
with open(filePath,mode='wb') as wf:
# 将文件分成很多分写入
for i in uploadFile.chunks():
wf.write(i)
wf.flush()
return HttpResponse('上传成功')
3、中间键 middleware
概念:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程)
1、使用:
1、在项目的目录下新建目录middleware
2、在middleware目录下新建一个py文件 模块A
3、在模块A中定义一个中间键类B,B类需要继承MiddlewareMixin
4、在B类中重新对应流程的方法
5、需要在setting中配置
在middleware中添加:目录名middleware.模块名A.类名B
2、常用的方法
1、def process_request(self,request):
该方法在进入url路由前执行,在该方法中可以使用 return 响应体来终止向后执行,直接响应客户端
所有的url请求都会执行它
场景:1、反爬虫 2、黑名单/白名单 3、vip区别
如:
def process_request(self,request):
print("***********************")
# 获得访问地址
print(request.path)
# 获得访问用户的ip地址
print(request.META["REMOTE_ADDR"])
addr = request.META["REMOTE_ADDR"]
# 黑名单
if addr in ["10.31.160.24","10.31.160.229"]:
return HttpResponse("滚吧,不欢迎你")
2、def process_exception(self,request,exception):
该方法在出现异常的时候执行,在该方法中可以处理跳过异常,使程序不出错
def process_exception(self,request,exception):
# 程序异常时,跳到首页
return HttpResponse('假装跳到首页')