APP开发之用户登录注册与文件上传

文件上传和获取

HTML页面的文件上传

  • 在html页面中我们要有一个上传的文件选择框,同时表单(form)也要有enctype属性

{% csrf_token %}
{% csrf_token %}
  • 注意Django框架下提交post请求,一定要有令牌(csrf_token)

从请求(request)中获取文件

  • 在python的Django框架下,我们可以通过request.FILES.get()来获取传递过来的文件


def func(request):
    if request.method == 'POST':
        s_img = request.FILES.get('s_img')
        passdef func(request):
    if request.method == 'POST':
        s_img = request.FILES.get('s_img')
        pass
  • 我们可以向储存其他变量的方式将文件的地址存入数据库的表中

在应用下的models.py中

  • 在models的代码中,我们要指定文件存储的相关参数


class Table(models.Model):
    s_img = models.ImageField(upload_to='upload')class Table(models.Model):
    s_img = models.ImageField(upload_to='upload')
  • 这里我们存的是图片,所以指定的是ImageField

  • 指定图片加载到upload路径下,这个目录是存放文件的

  • 如果我们设置了静态文件存放目录(static),那么upload目录将会被创建在static目录下

  • 但是我们一般会将用户上传的文件单独放置,所以我们需要在与应用同级目录下创建一个media目录,用于存放用户上传的文件

 

  • 需要注意的是,django并不知道我们设置了新的目录用于存放用户上传的文件,这时候我们就需要在项目的setting中设置路径


MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
  • 完成了上述操作,上传文件并储存的功能才算实现了

注册登录

在HTML文件

  • 中我们通过提交表单(form)的方式(post),向服务器发送注册和登录的信息


{% csrf_token %}
{% csrf_token %}

Django原生注册和登录

  • Django为我们提供了原生的注册和登录验证方法,我们可以快速的实现注册登录功能

原生注册

  • 我们要用到django.contrib.auth.models模块下的User,它是Django中自带的用户信息储存模型,对应数据库中的auth_user表(Django自动创建的)


def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 验证信息完整性和正确性
        
        User.objects.create_user(username=username, password=pwd)
        # User.objects.create_superuser(username=username, password=pwd)def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 验证信息完整性和正确性
        
        User.objects.create_user(username=username, password=pwd)
        # User.objects.create_superuser(username=username, password=pwd)
  • 通过request.POST.get()方法获取到用户提交的信息,验证验证信息完整性和正确性后,我们将信息存入数据库中的auth_user表中

  • 我们可以通过User.objects.create,User.objects.create_user,User.objects.create_superuser 三种方法在auth_user表中创建数据

  • 需要注意的是User.objects.create,创建的数据,密码部分是没有加密处理的,而User.objects.create_user,User.objects.create_superuser 两种方法创建的数据都是经过加密处理的

  • User.objects.create_user创建的是普通用户

  • User.objects.create_superuser 创建的是超级用户——管理员

原生登录验证

  • 我们要用到django.contrib模块下的auth


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 验证用户是否存在
        user = auth.authenticate(username=username,password=pwd)
        if user:
            auth.login(request,user)def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # 验证用户是否存在
        user = auth.authenticate(username=username,password=pwd)
        if user:
            auth.login(request,user)
  • 通过request.POST.get()方法获取到用户提交的信息

  • 通过auth.authenticate方法验证用户是否存在,如果存在返回用户对象,如果不存在返回空

  • 如果用户对象存在,我们就可以通过auth.login(request,user)方法进行登录

  • 只用通过了auth.login方法让用户登录了,用户下次的请求(request)中的user才会存有当前用户的信息

原生退出

  • 我们通过Django原生登录后需要用到auth.logout(request)方法来退出,这个方法会清除请求(request)中的user的信息

原生验证是否登录

  • 使用了Django原生的登录验证,我们在请求登陆后才能访问的页面是,就需要对是否登录进行验证

  • 我们使用django.contrib.auth.decorators模块中login_required方法处理urls中的方法


urlpatterns = [
#Django 验证是否登录login_required
url(r'^index/', login_required(views.index), name='index'),
]urlpatterns = [
#Django 验证是否登录login_required
url(r'^index/', login_required(views.index), name='index'),
]
  • 如果验证通过,将调用views中对应的方法

  • 如果验证没通过,我们需要告诉Django要跳转到的页面,就需要在项目的setting中指定跳转地址


# 没有登录跳转地址
LOGIN_URL = '/user/login/'# 没有登录跳转地址
LOGIN_URL = '/user/login/'

 

 

自定义的注册登录

  • 有时候我们因项目需要,需要自己写用户的注册登录这里我们要自己生成验证是否登录的ticket,在我们自己定义的user表和cookie中都存入同一个ticket,用来验证用户是否登录

自定义的注册

  • 自定义注册和用Django自带的注册大同小异,唯一不同的是,我们需要自己创建一个user表用于存放用户的注册信息,表中有一列为ticket存放用户是否登录

  • 需要注意的是ticket不要用bool类型,用字符串,用bool类型很容易被骗过登录认证

自定义登录

  • 这里我们要自己生成验证是否登录的ticket,在我们自己定义的user表和cookie中都存入同一个ticket,用来验证用户是否登录


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        user=Users.objects.filter(username=username,password=pwd).first()
        if user:
            # 用随机方法生成ticket的值
            ticket = 'xxxxx'
            # 将ticket存入对应用户表中
            user.ticket = ticket
            user.save()
            response = HttpResponseRedirect(reverse('app:index'))
            # 保存到用户端的cookie中
            response.set_cookie('ticket',ticket)
            return responsedef login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        user=Users.objects.filter(username=username,password=pwd).first()
        if user:
            # 用随机方法生成ticket的值
            ticket = 'xxxxx'
            # 将ticket存入对应用户表中
            user.ticket = ticket
            user.save()
            response = HttpResponseRedirect(reverse('app:index'))
            # 保存到用户端的cookie中
            response.set_cookie('ticket',ticket)
            return response
  • 这里需要注意的是,ticket最好用随机的方式生成

  • 将ticket存入服务端的表和用户端的cookie中

  • 在请求登录后的页面的时候,我们要讲请求(request)和服务器中的ticket进行验证

自定义退出

  • 由于我们自定义登录的时候,在cookie中存入了ticket,在退出登录时我们就要将cookie中的ticket删除掉


def logout(request):
    if request.method == 'GET':
        response = HttpResponseRedirect(reverse('user:login'))
        response.delete_cookie('ticket')
        return responsedef logout(request):
    if request.method == 'GET':
        response = HttpResponseRedirect(reverse('user:login'))
        response.delete_cookie('ticket')
        return response

验证是否登录

装饰器方法

  • 我们可以通过装饰器,装饰views中每个处理页面请求的方法

  • 在装饰器中实现验证方法

 def CheckTicket(func):
    def inner(request):
        ticket = request.COOKIES.get('ticket')
        user = Users.objects.filter(ticket=ticket)
        if user:
            return func(request)
        else:
            return HttpResponseRedirect(reverse('user:login'))
    return inner
        
  • 这里我们定义了验证登录的装饰器,验证原理也是验证ticket

  • 我们用装饰器装饰views中每个处理页面请求的方法


@CheckTicket
def index(request):
    psss@CheckTicket
def index(request):
    psss

 

通过中间件验证是否登录

  • 我们还可以通过中间件来对请求进行过滤,不满足要求的请求(request)过滤掉,也就是不再往后台传递

  • 我们需要使用到process_request请求拦截,在定义的中间件类中,方法名必须为process_request

  • 我们需要在与应用同一级的目录中创建一个utils目录用于存放我们自定义的中间件

 

  • 定义中间件类,在utils目录中创建py文件,要记得加上init.py文件。为了作为包导入


class UserAuthMiddle(MiddlewareMixin):
    def process_request(self,request):
        # 获取当前请求的url
        path = request.path
        # 设置过滤的url
        s = ['/user/login/','/user/register/']
        if path in s :
            return None
        
        ticket = request.COOKIES.get('ticket')
        if not ticket:
            return HttpResponseRedirect(reverse('user:login'))
        user = Users.objects.filter(ticket=ticket)
        if not user:
            return HttpResponseRedirect(reverse('user:login'))
        # 如果验证通过,将user存在request的user中
        request.user = userclass UserAuthMiddle(MiddlewareMixin):
    def process_request(self,request):
        # 获取当前请求的url
        path = request.path
        # 设置过滤的url
        s = ['/user/login/','/user/register/']
        if path in s :
            return None
        
        ticket = request.COOKIES.get('ticket')
        if not ticket:
            return HttpResponseRedirect(reverse('user:login'))
        user = Users.objects.filter(ticket=ticket)
        if not user:
            return HttpResponseRedirect(reverse('user:login'))
        # 如果验证通过,将user存在request的user中
        request.user = user
  • 我们还需要在项目的setting文件中配置我们自定义的中间件类


MIDDLEWARE = ['utils.UserAuthMiddleware.UserAuthMiddle',]MIDDLEWARE = ['utils.UserAuthMiddleware.UserAuthMiddle',]

 

你可能感兴趣的:(APP开发之用户登录注册与文件上传)