1.概述
目前市面上web項(xiàng)目大多數(shù)是由java語(yǔ)言開(kāi)發(fā)(結(jié)合spring框架),但這并不意味著只有java語(yǔ)言能夠開(kāi)發(fā)web項(xiàng)目,python語(yǔ)言、go語(yǔ)言同樣可以做到。本文將利用Django框架(由python語(yǔ)言開(kāi)發(fā)的web框架)來(lái)搭建一個(gè)簡(jiǎn)單的web項(xiàng)目,并實(shí)現(xiàn)簡(jiǎn)單登錄功能。
2.實(shí)現(xiàn)過(guò)程
2.1 Django框架簡(jiǎn)介
2.1.1 Django框架優(yōu)點(diǎn)
Django遵循MVC(Model-View-Controller)設(shè)計(jì)模式,提供了許多較為強(qiáng)大和便捷的工具來(lái)幫助開(kāi)發(fā)。它的優(yōu)勢(shì)主要體現(xiàn)在以下幾個(gè)方面:
- 易于擴(kuò)展:Django框架提供豐富的插件和模塊,可以輕松地進(jìn)行擴(kuò)展和定制,例如:Django Fluent Dashboard、Python social auth等;
- 安全性較高:Django框架內(nèi)置了XSS(跨站點(diǎn)腳本)防護(hù)、CSRF(跨站點(diǎn)請(qǐng)求偽造)保護(hù)、密碼哈希加密等;
- 模塊獨(dú)立化:Django框架基于松耦合的設(shè)計(jì)原則,內(nèi)部高度模塊化,不同的模塊可以獨(dú)立編寫(xiě)、調(diào)測(cè),極大地提高編寫(xiě)和測(cè)試的靈活性;
- 自帶后臺(tái):Django框架自帶了一個(gè)豐富的后臺(tái)管理系統(tǒng),可以輕松實(shí)現(xiàn)一些內(nèi)容管理;
- 內(nèi)置ORM框架:內(nèi)置ORM,簡(jiǎn)單幾行代碼就可以連接數(shù)據(jù)庫(kù),并執(zhí)行sql語(yǔ)句。
2.1.2 Django Web框架基礎(chǔ)組件
Django的組件主要分為四個(gè)部分,模型(Model)、視圖(View)、模版(Template)、路由(URLconf),具體解釋如下:
- 模型(Model):主要負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和操作,和MVC中M層作用一致;
- 視圖(View):負(fù)責(zé)處理HTTP請(qǐng)求并返回HTTP相應(yīng),和MVC中的V層作用一致;
- 模板(Template):負(fù)責(zé)渲染數(shù)據(jù)并生成HTML頁(yè)面展示,類(lèi)似于MVC中的C層;
- URL路由(URLconf):負(fù)責(zé)將HTTP請(qǐng)求分發(fā)給相應(yīng)的視圖函數(shù)。
2.1.3 Django項(xiàng)目目錄
-
urls.py:網(wǎng)址入口,關(guān)聯(lián)到對(duì)應(yīng)的views.py中的一個(gè)函數(shù)(或generic類(lèi)),訪問(wèn)網(wǎng)址就對(duì)應(yīng)一個(gè)函數(shù)。
-
views.py:處理用戶發(fā)出的請(qǐng)求,與urls.py對(duì)應(yīng), 通過(guò)渲染templates中的網(wǎng)頁(yè)可以將顯示內(nèi)容,如登陸后的用戶名,用戶請(qǐng)求的數(shù)據(jù)等輸出到網(wǎng)頁(yè)。
-
models.py:與數(shù)據(jù)庫(kù)操作相關(guān),存入或讀取數(shù)據(jù)時(shí)用到,用不到數(shù)據(jù)庫(kù)時(shí)可以不使用。
-
forms.py:表單,用戶在瀏覽器上輸入數(shù)據(jù)提交,對(duì)數(shù)據(jù)的驗(yàn)證工作以及輸入框的生成等工作,也可以不使用。
-
templates文件夾:views.py中的函數(shù)渲染templates中的html模板,得到動(dòng)態(tài)內(nèi)容的網(wǎng)頁(yè),可以用緩存來(lái)提高速度。
-
admin.py:后臺(tái),可以用很少的代碼就擁有一個(gè)強(qiáng)大的后臺(tái)。
-
settings.py:Django 的配置文件,如 DEBUG 的開(kāi)關(guān),靜態(tài)文件的位置等。
2.2 搭建web項(xiàng)目
2.2.1 安裝django
常用pip指令進(jìn)行安裝,如下:
pip install django
由于國(guó)內(nèi)有墻,可以指定一些國(guó)內(nèi)源即可:
pip install django -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
安裝完成后,可以通過(guò)以下命令來(lái)驗(yàn)證是否成功安裝:
django-admin version
如果出現(xiàn)版本信息,則表明安裝成功,如下:
2.2.2 創(chuàng)建項(xiàng)目
創(chuàng)建成功后目錄結(jié)構(gòu)如下:
setting:項(xiàng)目的配置文件,可以配置APP、數(shù)據(jù)庫(kù)、中間件、模版等諸多信息;
urls:路由分發(fā)配置;
init:?jiǎn)?dòng)文件,會(huì)配置一些特殊信息;
manage:項(xiàng)目的管理文件;
wsgi:web服務(wù)器和Django交互的入口。
2.2.2 運(yùn)行測(cè)試
1.利用以下指令啟動(dòng)項(xiàng)目
python manage.py runserver
在控制臺(tái)中運(yùn)行上述指令,啟動(dòng)成功后控制臺(tái)會(huì)輸出以下內(nèi)容:
訪問(wèn)地址http://127.0.0.1:8000,會(huì)出現(xiàn)以下界面:
2.3 開(kāi)發(fā)登錄模塊
2.3.1 創(chuàng)建項(xiàng)目
通過(guò)以下指令來(lái)創(chuàng)建python web項(xiàng)目,用于實(shí)現(xiàn)登錄模塊創(chuàng)建:
python manage.py startapp system
上述指令中的system就是登錄模塊名稱(chēng)。
2.3.2 注冊(cè)應(yīng)用程序
在根目錄的setting.py文件中,將上述登錄模塊添加至INSTALLED_APPS 列表中,如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'system'
]
2.3.3 配置連接數(shù)據(jù)庫(kù)
本文測(cè)試所使用的數(shù)據(jù)庫(kù)為MySQL,在根目錄的setting.py文件中,在DATABASES中配置MySQL連接信息,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'HOST': '128.71.104.132',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123456'
}
}
同時(shí)在根目錄的_init_.py文件中添加如下配置,否則在啟動(dòng)時(shí)會(huì)報(bào)一些連接異常:
import pymysql
pymysql.install_as_MySQLdb()
2.3.4 定義模型
在Django 中,數(shù)據(jù)模型中使用Python類(lèi)來(lái)定義,我們需要在應(yīng)用程序(system)的 models.py 文件中定義數(shù)據(jù)模型,本文以用戶Account類(lèi)來(lái)定義:
# Create your models here.
class Account(models.Model):
password = models.CharField(max_length=200)
name = models.CharField(max_length=20)
email = models.CharField(max_length=20)
mobile = models.CharField(max_length=20)
id = models.IntegerField(primary_key=True)
上述代碼中定義了一個(gè)Account數(shù)據(jù)模型,包含id,mobile,email,name,password等屬性,max_length指定的是最大長(zhǎng)度。建立完成數(shù)據(jù)模型后,需要生成對(duì)應(yīng)表到數(shù)據(jù)庫(kù)中,運(yùn)行以下指令:
#指令1
python manage.py makemigrations
#指令2
python manage.py migrate
運(yùn)行指令1會(huì)生成一個(gè)新的遷移文件夾migrations,將模型映射到數(shù)據(jù)庫(kù)的文件將會(huì)被放在這個(gè)文件夾下。如下圖所示:
運(yùn)行指令2會(huì)將模型信息映射到數(shù)據(jù)庫(kù)中并生成表。
2.3.5 編寫(xiě)視圖函數(shù)
在 Django 中,視圖函數(shù)用于處理 HTTP 請(qǐng)求并生成 HTTP 響應(yīng)。因此在登錄模塊的views.py文件中,編寫(xiě)如下視圖函數(shù):
from django.shortcuts import render, HttpResponse, redirect, reverse
from system.models import Account
def login(request):
if request.method == 'POST':
print("進(jìn)入頁(yè)面")
name = request.POST['username']
password = request.POST['password']
print(name+":"+password)
#根據(jù)name查詢數(shù)據(jù)庫(kù),獲取列表中第一個(gè)元素
corr_user = Account.objects.filter(name=name).first()
print(dir(corr_user))
print("獲取到信息")
if password == corr_user.password:
print('登錄成功')
return HttpResponse('登錄成功')
return render(request, './system/login.html')
def logon(request):
return HttpResponse('logon')
def logout(request):
return redirect(reverse('login'))
def index(request):
print("進(jìn)入index")
return redirect(reverse('login'))
在上面的例子中,我們定義了名為 login、logon、logout 、index的視圖函數(shù)。在login函數(shù)中,我們校驗(yàn)了賬號(hào)和密碼信息,如果成功則返回登錄成功頁(yè)面,否則重新返回登錄頁(yè)面。
2.3.6 創(chuàng)建html登錄頁(yè)面
定義一個(gè)登錄頁(yè)面,包含登錄賬號(hào)和密碼等字段,該html放置在template文件夾下,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> 登陸 </title>
</head>
<body>
<div class="demo form-bg">
<div class="container">
<div class="row">
<div class="col-md-offset-4 col-md-4 col-sm-offset-3 col-sm-6">
<form class="form-horizontal" action="{% url 'login' %}" method="post">
<div class="heading">登陸</div>
<div class="form-group">
<i class="fa fa-user"></i><input required name="username" type="text"
class="form-control" placeholder="Username"
id="username">
</div>
<div class="form-group">
<i class="fa fa-lock"></i><input required name="password" type="password"
class="form-control" placeholder="password"/>
</div>
<div class="form-group">
<div class="form_btn">
<button type="submit">登錄</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
2.3.7 配置URL
在登錄模塊的urls.py文件中定義URL映射信息,具體如下:
from system.views import logout, logon, login
from django.urls import path
urlpatterns = [
path('login/', login, name='login'),
path('logon/', logon, name='logon'),
path('logout/', logout, name='logout'),
]
我們分別將login、logon和logout映射到對(duì)應(yīng)處理函數(shù)中。
2.3.8 測(cè)試驗(yàn)證
正確輸入賬號(hào)和密碼信息后會(huì)出現(xiàn)以下頁(yè)面:
同時(shí)控制臺(tái)會(huì)打印如下信息:
2.3.9 注意事項(xiàng)
在同一臺(tái)機(jī)器上啟動(dòng)項(xiàng)目,由前端直接訪問(wèn)python項(xiàng)目可能會(huì)出現(xiàn)跨域問(wèn)題,因此需要添加如下配置:
ALLOWED_HOSTS = ['*']
# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1']
3.小結(jié)
1.本文利用Django創(chuàng)建了一個(gè)python web項(xiàng)目,用于驗(yàn)證Django框架的便捷性,功能較為簡(jiǎn)單,并發(fā)和安全等相關(guān)性能需加強(qiáng);
2.本文登錄案例僅作為演示,需要進(jìn)一步豐富各類(lèi)入?yún)⑿r?yàn),網(wǎng)關(guān)驗(yàn)證用戶合法性等。
4.參考文獻(xiàn)
1.https://www.cnblogs.com/fuchangjiang/p/17854807.html
2.https://www.djangoproject.com/文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-817625.html
5.附錄
https://gitee.com/Marinc/python-web.git文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-817625.html
到了這里,關(guān)于利用Django搭建python web項(xiàng)目(簡(jiǎn)單登錄)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!