python+django(二)用户登录验证

7.模型激活和数据表创建,需要依次执行以下命令

python38 manage.py makemigrations app002

python38 manage.py sqlmigrate app002 0001

python38 manage.py migrate

这样之后,poi_db_user(在setting中写了)数据库中就会多一个app002_user数据表,字段为model.py中设置的字段。

往里面添加数据:

insert into app002_user (id,username,password,create_date) values (1,'lxx','666999','220405');

查看数据表里的内容:

接下来实现最终目的,登录验证然后下载文件。

参考了这两个教程:https://www.jb51.net/article/165880.htm

https://blog.csdn.net/Lockey23/article/details/73196502

进行了一些修改,最后成功啦,粘一下代码吧。


(1)mysite001/settings.py

from pathlibimport Path

import os

import pymysql

INSTALLED_APPS= [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'app002'

]

pymysql.install_as_MySQLdb()

DATABASES= {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'poi_db_users',# 数据库库名(需提前创建好数据库)

        'USER': 'root',# 用户名

        'PASSWORD': '666999',# 连接密码

        'HOST': 'localhost',# 主机

        'PORT': '3306',# mysql端口

    }

}

(1)mysite001/urls.py

from django.contribimport admin

from django.urlsimport path,include,re_path

urlpatterns= [

re_path(r'^app002/',include('app002.urls')),# 增加对应关系

    path('admin/', admin.site.urls),

]

(3)app-002/urls.py

from django.urlsimport re_path

from .import views

urlpatterns= [

re_path(r'^login/$', views.login,name='login'),

re_path(r'^index/$', views.index,name='index'),

re_path(r'^download/',views.file_down,name="download"),

]

(4)app-002/views.py

from django.shortcutsimport render,redirect

from .modelsimport User

from functoolsimport wraps

import os

from django.httpimport FileResponse

from django.utils.encoding import escape_uri_path

def login(request):  # 登陆页面

    if request.method=="POST":

        username=request.POST.get('username')

password=request.POST.get('password')

user=User.objects.filter(username=username,password=password)

print(user)

if user:

            #登录成功

# 1,生成特殊字符串

# 2,这个字符串当成key,此key在数据库的session表(在数据库存中一个表名是session的表)中对应一个value

# 3,在响应中,用cookies保存这个key ,(即向浏览器写一个cookie,此cookies的值即是这个key特殊字符)

            request.session['is_login']='1' # 这个session是用于后面访问每个页面(即调用每个视图函数时要用到,即判断是否已经登录,用此判断)

# request.session['username']=username # 这个要存储的session是用于后面,每个页面上要显示出来,登录状态的用户名用。

# 说明:如果需要在页面上显示出来的用户信息太多(有时还有积分,姓名,年龄等信息),所以我们可以只用session保存user_id

            request.session['user_id']=user[0].id

return redirect('/app002/index/')

else:

            render(request,'app002/login.html',{'error_msg': "用户名或密码输入错误,请再次输入"})

return render(request,'app002/login.html')

def check_login(f):

    @wraps(f)

def inner(request,*arg,**kwargs):

        if request.session.get('is_login')=='1':

            return f(request,*arg,**kwargs)

else:

            return redirect('/app002/login/')

return inner

@check_login

def index(request):#登陆成功之后跳转的页面

    user_list= User.objects.all()

context= {'user_list': user_list}

return render(request,'app002/index.html', context)

def file_down(request):

    file_name= "要共享的数据集.rar"

    base_dir= os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 项目根目录

    file_path= os.path.join(base_dir,'upload', file_name)# 下载文件的绝对路径

    if not os.path.isfile(file_path):  # 判断下载文件是否存在

        return FileResponse("Sorry but Not Found the File")

def file_iterator(file_path,chunk_size=512):

        """

文件生成器,防止文件过大,导致内存溢出

:param file_path: 文件绝对路径

:param chunk_size: 块大小

:return: 生成器

"""

        with open(file_path,mode='rb')as f:

            while True:

                c= f.read(chunk_size)

if c:

                    yield c

else:

                    break

    try:

        # 设置响应头

        response= FileResponse(file_iterator(file_path))

# 以流的形式下载文件,这样可以实现任意格式的文件下载

        response['Content-Type']= 'application/octet-stream'#设置头信息,告诉浏览器这是个文件

        response['Content-Disposition'] = 'attachment;filename="{}"'.format(escape_uri_path(file_name))

except:

        return FileResponse("Sorry but Not Found the File")

return response

(4)app-002/model.py

from django.dbimport models

# Create your models here.

class User(models.Model):

    id= models.IntegerField(primary_key=True)

username= models.CharField(max_length=16)

password= models.CharField(max_length=32)

create_date= models.DateTimeField('date published')

(6)templates/app002/login.html(后面设计界面时有改动,见下一个教程)

欢迎登录!

    {% csrf_token %}

   

        用户名:

       

   

   

        密码:

       

   

   

       

   

   


(7)templates/app002/index.html(后面设计界面时有改动,见下一个教程)

   



之前的代码

response['Content-Disposition']= 'attachment;filename="{}"'.format(file_name)

由于下载的文件是中文,所以下载的时候文件名总是“下载”也没有后缀,按照下面代码改了就好了:

from django.utils.encodingimport escape_uri_path

response['Content-Disposition']= 'attachment;filename="{}"'.format(escape_uri_path(file_name))

你可能感兴趣的:(python+django(二)用户登录验证)