Django 功能模块示例
记住我
参考地址:https://www.cnblogs.com/gaoshengyue/p/8028709.html
情况1:记住我,设置session过期时间(如:一周)
情况2:不记住我,则浏览器关闭的时候session过期
settings.py
SESSION_COOKIE_AGE = 60 # session过期时间60秒
views.py
def user_login(request): if request.method == "GET": return render(request, "login.html") username = request.POST.get('username') password = request.POST.get('password') remember_me = request.POST.get('remember_me') if not username: return JsonResponse(code.USERNAME_NONE) if not password: return JsonResponse(code.PASSWORD_NONE) user = UserModels.objects.filter(is_effective=True, userId=username).first() if user is None: return JsonResponse(code.ACCOUNT_NOT_EXIST) if check_password(password, user.password): # 已经登录则退出登录 if not request.user.is_anonymous(): logout(request) login(request, user) request.session.set_expiry(0) if remember_me: request.session.set_expiry(None) return JsonResponse(code.SUCCESS) return JsonResponse(code.PASSWORD_ERROR)
https://docs.djangoproject.com/en/2.2/topics/http/sessions/#using-sessions-in-views
Sets the expiration time for the session. You can pass a number of different values:
- If
valueis an integer, the session will expire after that many seconds of inactivity. For example, callingrequest.session.set_expiry(300)would make the session expire in 5 minutes. - If
valueis adatetimeortimedeltaobject, the session will expire at that specific date/time. Note thatdatetimeandtimedeltavalues are only serializable if you are using thePickleSerializer. - If
valueis0, the user’s session cookie will expire when the user’s Web browser is closed. - If
valueisNone, the session reverts to using the global session expiry policy.
Reading a session is not considered activity for expiration purposes. Session expiration is computed from the last time the session was modified.
添加AUTH_USER_MODEL 后,报错(没有迁移)
settings.py
AUTH_USER_MODEL = 'app.UserModels'
项目启动后报错
ValueError: Dependency on app with no migrations: app
解决方案:
python manage.py makemigrations app
文件上传
<form enctype="multipart/form-data" method="POST" action="/address/upload/"> <input type="file" name="file" /><br/> <input type="submit" value="上传文件" /> </form>
JS脚本,Ajax异步文件上传
var file_path= $("#file_input_id").val();//获取到input的value,里面是文件的路径 fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(); src = window.URL.createObjectURL(this.files[0]); //转成可以在本地预览的格式 $('#img_id').css("background-image", 'url(' + src + ')'); // 检查是否是图片 if (!fileFormat.match(/.png|.jpg|.jpeg/)) { alert('上传错误,文件格式必须为:png/jpg/jpeg'); return; } var formData = new FormData(); formData.append("file", $("#file_id").files[0]); //$("#file_input_id").prop('files')[0] $.ajax({ url: "upload.ashx", type: "POST", data: formData, //必须false才会自动加上正确的Content-Type contentType: false, //必须false才会避开jQuery对 formdata 的默认处理 //XMLHttpRequest会对 formdata 进行正确的处理 processData: false, success: function (data) { alert("上传成功!"); }, error: function () { alert("上传失败!"); } });
后台
forms.py
from django import forms class UploadFileForm(forms.Form): title = forms.CharField(max_length=50) file = forms.FileField()
views.py
def handle_uploaded_file(file): # 文件后缀名 suffix_name = '.' + file.name.split('.')[-1] file_name = str(uuid.uuid4()) + suffix_name destination = open(os.path.join(settings.MEDIA_ROOT, file_name), 'wb+') for chunk in file.chunks(): destination.write(chunk) destination.close() # 返回文件URL地址 file_url = os.path.join(settings.MEDIA_URL, file_name) return file_url def handle_uploaded_file2(f): file_name = "" try: path = "media/editor" + time.strftime('/%Y/%m/%d/%H/%M/%S/') if not os.path.exists(path): os.makedirs(path) file_name = path + f.name destination = open(file_name, 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() except Exception as e: print(e) return file_name def upload_file(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): handle_uploaded_file(request.FILES['file']) return HttpResponseRedirect('/success/url') else: form = UploadFileForm() return render_to_response('upload.html', {'form': form})
注意:只有当request方法是POST,且发送request的<form>有属性enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空。必须要将request.FILES传给form的构造函数,才能将文件数据绑定到form.
处理上传文件
字典request.FILES中的每一个条目都是一个UploadFile对象。UploadFile对象有如下方法:
1、UploadFile.read():
从文件中读取全部上传数据。当上传文件过大时,可能会耗尽内存,慎用。
2、UploadFile.multiple_chunks():
如上传文件足够大,要分成多个部分读入时,返回True.默认情况,当上传文件大于2.5M时,返回True。但这一个值可以配置。
3、UploadFile.chunks():
返回一个上传文件的分块生成器。如multiple_chunks()返回True,必须在循环中使用chrunks()来代替read()。一般情况下直接使用chunks()就行。
4、UploadFile.name():上传文件的文件名
5、UplaodFile.size():上传文件的文件大小(字节)
上传文件保存的位置
保存上传文件前,数据需要存放在某个位置。默认时,当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。意味着保存文件只有一次从内存读取,一次写磁盘。
但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。
改变upload handler的行为
三个设置控制django文件上传的行为:
FILE_UPLOAD_MAX_MEMORY_SIZE:直接读入内存的最大上传文件大小(字节数)。当大于此值时,文件存放到磁盘。默认2.5M字节
FILE_UPLOAD_TEMP_DIR
FILE_UPLOAD_PERMISSIONS:权限
FILE_UPLOAD_HANDLERS
上传文件真正的处理器。修改此项设置可以完成自定义django上传文件的过程。
默认是:
("django.core.files.uploadhandler.MemoryFileUploadHandler", "django.core.files.uploadhandler.TemporaryFileUploadHandler",)
先尝试装入内存,如不行就存入到临时文件。

浙公网安备 33010602011771号