python+django(二)用戶登錄驗(yàn)證

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))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市与帆,隨后出現(xiàn)的幾起案子了赌,更是在濱河造成了極大的恐慌,老刑警劉巖玄糟,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勿她,死亡現(xiàn)場離奇詭異,居然都是意外死亡阵翎,警方通過查閱死者的電腦和手機(jī)逢并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭卫,“玉大人佑菩,你說我怎么就攤上這事鸽疾」常” “怎么了惕橙?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谓形。 經(jīng)常有香客問我灶伊,道長,這世上最難降的妖魔是什么寒跳? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任聘萨,我火速辦了婚禮,結(jié)果婚禮上童太,老公的妹妹穿的比我還像新娘米辐。我一直安慰自己,他們只是感情好书释,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布翘贮。 她就那樣靜靜地躺著,像睡著了一般爆惧。 火紅的嫁衣襯著肌膚如雪狸页。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音芍耘,去河邊找鬼址遇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斋竞,可吹牛的內(nèi)容都是我干的倔约。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼坝初,長吁一口氣:“原來是場噩夢啊……” “哼浸剩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳄袍,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绢要,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畦木,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸泛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年十籍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唇礁。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勾栗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盏筐,到底是詐尸還是另有隱情围俘,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布琢融,位于F島的核電站界牡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漾抬。R本人自食惡果不足惜宿亡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纳令。 院中可真熱鬧挽荠,春花似錦、人聲如沸平绩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捏雌。三九已至跃赚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間性湿,已是汗流浹背来累。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工砚作, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘹锁。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓葫录,卻偏偏與公主長得像,于是被迫代替她去往敵國和親领猾。 傳聞我的和親對象是個(gè)殘疾皇子米同,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容