7.模型激活和數(shù)據(jù)表創(chuàng)建奶躯,需要依次執(zhí)行以下命令
python38?manage.py?makemigrations app002
python38?manage.py?sqlmigrate app002 0001
python38?manage.py?migrate
這樣之后,poi_db_user(在setting中寫了)數(shù)據(jù)庫中就會多一個(gè)app002_user數(shù)據(jù)表亿驾,字段為model.py中設(shè)置的字段嘹黔。
往里面添加數(shù)據(jù):
insert into app002_user (id,username,password,create_date) values (1,'lxx','666999','220405');
查看數(shù)據(jù)表里的內(nèi)容:
接下來實(shí)現(xiàn)最終目的,登錄驗(yàn)證然后下載文件莫瞬。
參考了這兩個(gè)教程:https://www.jb51.net/article/165880.htm
https://blog.csdn.net/Lockey23/article/details/73196502
進(jìn)行了一些修改儡蔓,最后成功啦,粘一下代碼吧疼邀。
(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',# 數(shù)據(jù)庫庫名(需提前創(chuàng)建好數(shù)據(jù)庫)
? ? ? ? 'USER': 'root',# 用戶名
? ? ? ? 'PASSWORD': '666999',# 連接密碼
? ? ? ? 'HOST': 'localhost',# 主機(jī)
? ? ? ? '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')),# 增加對應(yīng)關(guān)系
? ? 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,這個(gè)字符串當(dāng)成key旁振,此key在數(shù)據(jù)庫的session表(在數(shù)據(jù)庫存中一個(gè)表名是session的表)中對應(yīng)一個(gè)value
# 3获询,在響應(yīng)中,用cookies保存這個(gè)key ,(即向?yàn)g覽器寫一個(gè)cookie,此cookies的值即是這個(gè)key特殊字符)
? ? ? ? ? ? request.session['is_login']='1' # 這個(gè)session是用于后面訪問每個(gè)頁面(即調(diào)用每個(gè)視圖函數(shù)時(shí)要用到,即判斷是否已經(jīng)登錄拐袜,用此判斷)
# request.session['username']=username # 這個(gè)要存儲的session是用于后面筐付,每個(gè)頁面上要顯示出來,登錄狀態(tài)的用戶名用阻肿。
# 說明:如果需要在頁面上顯示出來的用戶信息太多(有時(shí)還有積分瓦戚,姓名,年齡等信息)丛塌,所以我們可以只用session保存user_id
? ? ? ? ? ? request.session['user_id']=user[0].id
return redirect('/app002/index/')
else:
? ? ? ? ? ? render(request,'app002/login.html',{'error_msg': "用戶名或密碼輸入錯誤较解,請?jiān)俅屋斎?})
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):#登陸成功之后跳轉(zhuǎn)的頁面
? ? user_list= User.objects.all()
context= {'user_list': user_list}
return render(request,'app002/index.html', context)
def file_down(request):
? ? file_name= "要共享的數(shù)據(jù)集.rar"
? ? base_dir= os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 項(xiàng)目根目錄
? ? 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):
? ? ? ? """
文件生成器,防止文件過大畜疾,導(dǎo)致內(nèi)存溢出
: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:
? ? ? ? # 設(shè)置響應(yīng)頭
? ? ? ? response= FileResponse(file_iterator(file_path))
# 以流的形式下載文件,這樣可以實(shí)現(xiàn)任意格式的文件下載
? ? ? ? response['Content-Type']= 'application/octet-stream'#設(shè)置頭信息,告訴瀏覽器這是個(gè)文件
? ? ? ? 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(后面設(shè)計(jì)界面時(shí)有改動印衔,見下一個(gè)教程)
<body>
<h1>歡迎登錄啡捶!</h1>
<form action="/app002/login/" method="post">
? ? {% csrf_token %}
? ? <p>
? ? ? ? 用戶名:
? ? ? ? <input type="text" name="username">
? ? </p>
? ? <p>
? ? ? ? 密碼:
? ? ? ? <input type="text" name="password">
? ? </p>
? ? <p>
? ? ? ? <input type="submit" value="登錄">
? ? </p>
? ? <hr>
</form>
</body>
(7)templates/app002/index.html(后面設(shè)計(jì)界面時(shí)有改動,見下一個(gè)教程)
<body>
? ? <div class="col-md-4">
? ? <a href="{% url 'download' %}" rel="external nofollow" >
? ? ? ? 要下載的文件
? ? </a>
? ? </div>
</body>
之前的代碼
response['Content-Disposition']= 'attachment;filename="{}"'.format(file_name)
由于下載的文件是中文奸焙,所以下載的時(shí)候文件名總是“下載”也沒有后綴瞎暑,按照下面代碼改了就好了:
from django.utils.encodingimport escape_uri_path
response['Content-Disposition']= 'attachment;filename="{}"'.format(escape_uri_path(file_name))