自学python 进击之路 - Django-内建用户系统&文件上传

728 阅读3分钟

src=http___5b0988e595225.cdn.sohucs.com_images_20190916_32ce26032b124c3cb145a4231627373d.jpeg&refer=http___5b0988e595225.cdn.sohucs.jpg

内建用户系统

定义

- Django带有一个用户认证系统。它处理用户账号、组、权限以及基于cookies的用户会话
-  用户可以直接使用Django自带的用户表

它的基本字段

  • 模型类位置from django.contrib.auth.models import User
username用户名
password密码
email邮箱
first_name
last_name
is_superuser是否是管理员账号
is_staff是否可以访问admin管理界面
is_active是否活跃用户,默认True。 一般不删除用户,而是将用户的is_actuice设为False
last_login上一次的登录时间
date_joined用户创建的时间

基本模型操作-创建用户

1.创建普通用户create_user

from django.contrib.auth.models import User
user = User.object.create_user(username= '用户名', password='密码' , email =' 邮箱' . . .  )

2.创建超级用户Create_superuser

from django.contrib.auth.models import Useruser = User.objects.create_superuser(username='用户名', password='密码', email='邮箱')

基本模型操作-创建用户

form django.contrid.auth.models import User
try:
   user= User.objects.get(username='用户名')
   user.is_active = False # 记当前用户无效
   user.save()
   print('删除普通用户成功')
except:
   print('删除普通用户失败')

基本模型操作- 检验密码

from django.contrib.auth import authenticate
user = authenticate(username = username, password = password)
说明:
    如果用户密码校验成功则返回对应的user对象 ,否则返回None   

基本模型操作- 修改密码

from django.contrib.auth.models import User
try:
   user= User.objects.get(username='用户名')
   user.set_password('654321')
   user.save()
   return HttpResponse('修改密码成功')
except:
    return HttpResponse('修改密码失败')

基本模型操作- 登录状态保持

from django.contrib.auth import login
def login_view(request):
    user = authenitcate(username= username, password =password)
    login(request,user)

基本模型操作- 登录状态检验

from django.contrib.auth.decorators import login_required

@login_required
def index_view(request):
    # 该视图必须为用户登录状态下才可访问
    # 当前登录用户可通过request.user获取
    login_user = requrest.user
    ....

基本模型操作- 登录转态取消


from django.contrib.auth import logout
def logout_view(request):
    logout(request)

文件上传

定义&场景

- 定义:用户可以通过浏览器将图片等文件传至网站
- 场景:
  - 用户传头像
  - 上传流程性的文档[pdf.txt等]

上传规范-前端[html]

# 文件上传必须为POST提交方式
表单`<from>`中文件上传时必须有带有enctype = 'multipart/form-data'时才会包含文件内容数据
表单中用<input type='file' name='xxx'>标签上传文件

上传规范-后端[django]

视图函数中, 用request.FILES取 文件框的内容
file = request.FILES['xxx']
说明:
    1.FILES的key对应页面中 file 框的name值
    2.file 绑定文件流对象
    3.file.name文件名
    4.file.file文件的字节流数据
    
 配置文件的访问路径和存储路径
 在setting.py 中设置MEDIA相关配置;Django把用户上传的文件统称为media资源
 Django把用户上传的文件,统称为media资源
 # settings.py
 MEDIA_URL= '/media/'
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
 
 MEDIA_URL 和 MEDIA_ROOT 需要手动绑定
 步骤: 主路由中 添加 路由
 from django.conf import settings
 from django.conf.conf.urls.static import static 
 urlpattens += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
 说明:等价于做了MEDIA_URL开头的路由,DJango接到该特征请求后去MEDIA——ROOT路径查找资源

文件写入方案1: 传统的open方式

@csrf_exempt
def upload_view(request):
   if request.method == 'GET':
      return render(request, 'test_upload.html')
   elif request.method == 'POST':
      a_file = request.FILES['myfile']
      print('上传文件名是:', a_file.name)
      filename= os.path.join(settings.MEDIA_ROOT,a_file.name)
      with open(filename, 'wb') as f :
            data = a_file.file.read()
            f.write(data)
      return HttpResponse('接收文件:'+ a_file.name + '成功')

文件写入方案2:借助ORM

# 字段: FileField(upload= '子目录')
# Create your models here.
class Content(models.Model):
    title = models.CharField('文章名字', max_length=11)
    picture = models.FileField(upload_to='picture')

案例:

# 1.创建应用
# 项目终端运行 python3 manage.py startapp upload_app
# 2. 编写字段
# upload_app/models.py
class Content(models.Model):
    title = models.CharField('文章名字', max_length=11)
    picture = models.FileField(upload_to='picture')
# 3.创建视图
# views.py

def test_upload(request):
    if request.method == "GET":
        return render(request, 'test_upload.html')
    elif request.method == 'POST':
        title = request.POST['title']
        myfile = request.FILES['myfile']
        Content.objects.create(title=title, picture=myfile)
        return HttpResponse('---上传文件成功---')
 # 4.创建模板
 # 在templates目录下创建test_upload.html
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <form action="/test_upload" method="post" enctype="multipart/form-data">
       {#  处理csrf防范    #}
       {% csrf_token %}
       <p>
           <input type="text" name="title">
       </p>
           <p>
           <input type="file" name="myfile">
       </p>
           <p>
           <input type="submit"  value="上传">
       </p>
   </form>
</body>
</html>
# 5.配置路由
# urls.py
  path('test_upload', views.test_upload)