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

set_expiry(value)

Sets the expiration time for the session. You can pass a number of different values:

  • If value is an integer, the session will expire after that many seconds of inactivity. For example, calling request.session.set_expiry(300) would make the session expire in 5 minutes.
  • If value is a datetime or timedelta object, the session will expire at that specific date/time. Note that datetime and timedelta values are only serializable if you are using the PickleSerializer.
  • If value is 0, the user’s session cookie will expire when the user’s Web browser is closed.
  • If value is None, 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",)

先尝试装入内存,如不行就存入到临时文件。

 

posted @ 2019-07-31 08:43  逐梦客!  阅读(497)  评论(0)    收藏  举报