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(后面设计界面时有改动,见下一个教程)
欢迎登录!
(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))