應(yīng)用程序有兩種模式C/S、B/S焕议。C/S是客戶端/服務(wù)器端程序设哗,也就是說(shuō)這類程序一般獨(dú)立運(yùn)行。而B(niǎo)/S就是瀏覽器端/服務(wù)器端應(yīng)用程序抠蚣,這類應(yīng)用程序一般借助Chrome等瀏覽器來(lái)運(yùn)行。WEB應(yīng)用程序一般是B/S模式履澳。Web應(yīng)用程序首先是“應(yīng)用程序”嘶窄,和用標(biāo)準(zhǔn)的程序語(yǔ)言,如C距贷、C++等編寫(xiě)出來(lái)的程序沒(méi)有什么本質(zhì)上的不同柄冲。然而Web應(yīng)用程序又有自己獨(dú)特的地方,就是它是基于Web的忠蝗,而不是采用傳統(tǒng)方法運(yùn)行的现横。換句話說(shuō),它是典型的瀏覽器/服務(wù)器架構(gòu)的產(chǎn)物阁最。B/S結(jié)構(gòu)能夠很好地應(yīng)用在廣域網(wǎng)上戒祠,成為越來(lái)越多的企業(yè)的選擇。
一個(gè)Web應(yīng)用程序是由完成特定任務(wù)的各種Web組件(web components)構(gòu)成的并通過(guò)Web將服務(wù)展示給外界闽撤。在實(shí)際應(yīng)用中得哆,Web應(yīng)用程序是由多個(gè)模型(model)-視圖(view)-控制器(controller)等組織起來(lái)的代碼組成脯颜,這些組件相互協(xié)調(diào)為用戶提供一組完整的服務(wù)哟旗。
Web應(yīng)用程序?qū)ζ髽I(yè)的重要用途是對(duì)數(shù)據(jù)進(jìn)行處理,管理信息系統(tǒng)(Management Information System,簡(jiǎn)稱MIS)就是這種架構(gòu)最典型的應(yīng)用栋操。MIS可以應(yīng)用于局域網(wǎng)闸餐,也可以應(yīng)用于廣域網(wǎng)》剑基于Internet的MIS系統(tǒng)以其成本低廉舍沙、維護(hù)簡(jiǎn)便、覆蓋范圍廣剔宪、功能易實(shí)現(xiàn)等諸多特性拂铡,得到越來(lái)越多的應(yīng)用。
本文就是嘗試?yán)肞ython語(yǔ)言實(shí)現(xiàn)商品管理系統(tǒng)葱绒,增強(qiáng)對(duì)Web應(yīng)用系統(tǒng)需求感帅、設(shè)計(jì)、開(kāi)發(fā)的知識(shí)和能力地淀。
Python已經(jīng)有將近30年的歷史失球,在過(guò)去30年中,Python在運(yùn)維工程師和數(shù)據(jù)科學(xué)家群體中受到廣泛歡迎帮毁,然而卻極少有企業(yè)將Python作為生產(chǎn)環(huán)境的首選語(yǔ)言实苞。在最近幾年豺撑,這一情況有所改變。隨著云計(jì)算黔牵、大數(shù)據(jù)以及人工智能技術(shù)的快速發(fā)展聪轿,Python及其開(kāi)發(fā)生態(tài)環(huán)境正在受到越來(lái)越多的關(guān)注。
互聯(lián)網(wǎng)時(shí)代來(lái)臨后荧止,Python被用來(lái)在Web開(kāi)發(fā)領(lǐng)域進(jìn)行嘗試屹电,涌現(xiàn)出了一批基于Python開(kāi)發(fā)一些WEB的網(wǎng)站,還有不少大型的跃巡、基于Python的網(wǎng)站危号,比如Youtube、豆瓣等網(wǎng)站素邪。使得一些Web開(kāi)源框架迅速成長(zhǎng)外莲,如Django、Flask等兔朦,為程序員高效開(kāi)發(fā)Web程序提供了巨大的幫助偷线。
進(jìn)入了云計(jì)算時(shí)代,基于過(guò)去一段時(shí)間Python在系統(tǒng)管理工具的積累沽甥,以及其本身具備了非常好的系統(tǒng)集成能力声邦,Python在云計(jì)算領(lǐng)域可以說(shuō)大放異彩。最著名的是Python開(kāi)發(fā)的Openstack摆舟。不僅在私有云領(lǐng)域亥曹,在公有云領(lǐng)域,包括AWS恨诱,包括Google云媳瞪,當(dāng)這些公有云提供出SDK的時(shí)候,它們首選的技術(shù)路線依然是Python照宝。
最近兩年又火起來(lái)的人工智能領(lǐng)域蛇受,Python靠著過(guò)去多年在科學(xué)計(jì)算等方面的積累出現(xiàn)了大爆發(fā)。比如圖像識(shí)別用的都是Python OpenCV庫(kù)厕鹃。在深度學(xué)習(xí)領(lǐng)域幾乎沒(méi)有任何其他語(yǔ)言可以跟Python相提并論的兢仰,比如Caffe,Theano剂碴,TesnorFlow把将,Keras這些非常流行的深度學(xué)習(xí)框架,都是以Python為主要開(kāi)發(fā)語(yǔ)言汗茄。事實(shí)證明了在深度學(xué)習(xí)領(lǐng)域目前Python是處于非常主導(dǎo)的地位秸弛。
如上所述,為了能跟上人工智能的潮流,從用戶體驗(yàn)角度递览,從開(kāi)發(fā)者角度來(lái)講叼屠,Python是更好的語(yǔ)言,也是更好的接口語(yǔ)言绞铃,值得我們學(xué)習(xí)和掌握它镜雨。另一方面,考慮到可以用Python集成各種各樣的服務(wù)儿捧,這樣能有效降低成本荚坞,同時(shí)也能夠減輕自己開(kāi)發(fā)團(tuán)隊(duì)的壓力,讓開(kāi)發(fā)團(tuán)隊(duì)能夠減少一些學(xué)習(xí)成本菲盾。
Django是Python中目前風(fēng)靡的Web Framework,框架能夠幫助我們把程序的整體架構(gòu)搭建好,而我們所需要做的工作就是填寫(xiě)邏輯,而框架能夠在合適的時(shí)候調(diào)用你寫(xiě)的邏輯,而不需要我們自己去調(diào)用邏輯,讓W(xué)eb開(kāi)發(fā)變的更敏捷.
Django是一個(gè)高級(jí)Python Web框架,鼓勵(lì)快速,簡(jiǎn)潔,以程序設(shè)計(jì)的思想進(jìn)行開(kāi)發(fā).通過(guò)使用這個(gè)框架,可以減少很多開(kāi)發(fā)麻煩,使你更專注于編寫(xiě)自己的app,而不需要重復(fù)造輪子. Django免費(fèi)并且開(kāi)源颓影。
2.1Django特點(diǎn)
1)完全免費(fèi)并開(kāi)源源代碼。
2)快速高效開(kāi)發(fā)懒鉴。
3)使用MTV架構(gòu)(熟悉Web開(kāi)發(fā)的應(yīng)該會(huì)說(shuō)是MVC架構(gòu))诡挂。
4)強(qiáng)大的可擴(kuò)展性。
2.2Django工作方式
用戶在瀏覽器中輸入U(xiǎn)RL后的回車,瀏覽器會(huì)對(duì)URL進(jìn)行檢查,首先判斷協(xié)議,如果是http就按照Web來(lái)處理,然互調(diào)用DNS查詢,將域名轉(zhuǎn)換為IP地址,然后經(jīng)過(guò)網(wǎng)絡(luò)傳輸?shù)竭_(dá)對(duì)應(yīng)Web服務(wù)器,服務(wù)器對(duì)url進(jìn)行解析后,調(diào)用View中的邏輯(MTV中的V),其中又涉及到Model(MTV中的M),與數(shù)據(jù)庫(kù)的進(jìn)行交互,將數(shù)據(jù)發(fā)到Template(MTV中的T)進(jìn)行渲染,然后發(fā)送到瀏覽器中,瀏覽器以合適的方式呈現(xiàn)給用戶临谱。
圖2-1工作方式
本文使用的主要開(kāi)發(fā)環(huán)境為:
1)操作系統(tǒng):macOS Sierra 10.12.4
2)開(kāi)發(fā)語(yǔ)言:Python 3.6.1
3)Web框架:Django1.11.1
4)數(shù)據(jù)庫(kù):SQLite3
5)前端框架:Bootstrap3.3.7
6)開(kāi)發(fā)IDE:PycharmCE 2017.1
7)虛擬環(huán)境:Anaconda 4.3.17
8)版本管理:GitHub
使用終端安裝最新版的Django:
conda
install Django
Bootstrap璃俗,來(lái)自Twitter,是目前最受歡迎的前端框架悉默。Bootstrap是基于HTML城豁、CSS、JAVASCRIPT的抄课,它簡(jiǎn)潔靈活唱星,使得Web開(kāi)發(fā)更加快捷。
從官網(wǎng)下載所需資源剖膳,稍后復(fù)制到開(kāi)發(fā)目錄中:
http://getbootstrap.com/getting-started/#download
圖2-2
BootStrap目錄
主要功能和設(shè)計(jì)考慮如圖3-1所示:
從現(xiàn)在開(kāi)始正式的進(jìn)入代碼階段魏颓,簡(jiǎn)述開(kāi)發(fā)過(guò)程岭辣。
我們創(chuàng)建一個(gè)名為WebStore的Django項(xiàng)目吱晒,創(chuàng)建項(xiàng)目的指令[1](終端)如下:
django-admin.py
startproject WebStore
文件結(jié)構(gòu)如下:
WebStore
├── manage.py
└── WebStore
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
DATABASES = {
'default': {
'ENGINE':? ? 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR,? ? 'db.sqlite3'),
}
}
Django項(xiàng)目建成后,就可以設(shè)置數(shù)據(jù)庫(kù)了。本文默認(rèn)使用SQLite數(shù)據(jù)庫(kù),在WebStore/WebStore/setting.py中可以查看和修改數(shù)據(jù)庫(kù)設(shè)置:
還可以設(shè)置其他數(shù)據(jù)庫(kù),如MySQL, PostgreSQL,現(xiàn)在為了便于發(fā)布和提供老師審核,使用默認(rèn)數(shù)據(jù)庫(kù)設(shè)置沦童。
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
Django支持國(guó)際化仑濒,多語(yǔ)言。Django的國(guó)際化是默認(rèn)開(kāi)啟的偷遗,如果不需要國(guó)際化支持墩瞳,可以在設(shè)置文件中設(shè)置USE_I18N = False,那么Django會(huì)進(jìn)行一些優(yōu)化氏豌,不加載國(guó)際化支持機(jī)制喉酌。在WebStore/WebStore/setting.py修改默認(rèn)的語(yǔ)言和時(shí)區(qū)。
靜態(tài)文件是指網(wǎng)站中的js,css,圖片,視頻等文件泪电,通常在WebStore/WebStore/setting.py中已經(jīng)設(shè)置好了般妙。在WebStore根目錄下創(chuàng)建static文件夾,在static下再創(chuàng)建upload相速、css碟渺、js、image等目錄突诬。
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),? ? '/Users/alexmac/Library/Mobile\? ? Documents/com\~apple\~CloudDocs/DEV/WebStore/static/',#物理路徑
]
在Django中的app被認(rèn)為是一個(gè)功能模塊,與其他的web框架可能有很大的區(qū)別,將不通功能放在不同的app中,方便代碼的復(fù)用苫拍。在WebStore目錄下,終端輸入創(chuàng)建app指令:
python
manage.py startapp commodity
WebStore根目錄下旺隙,文件結(jié)構(gòu)如下:
── commodity
│ ├── __init__.py
│ ├── admin.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├─db.sqlite3
├─manage.py
├─WebStore
├── __init__.py
├── settings.py
├── urls.py
必須在WebStore/WebStore/setting.py下添加新建app
INSTALLED_APPS = (
...
'commodity', #這里填寫(xiě)的是app的名稱
)
在WebStore/commodity/models.py下編寫(xiě)如下程序:
class? ? Commondity(models.Model):
CommodityName =? ? models.CharField('商品名稱', max_length=100)
CommodityCategory =? ? models.CharField('商品類別', max_length=50,? ? blank=True)
CommodityPrice =? ? models.DecimalField('商品價(jià)格', max_digits=11,? ? decimal_places=2)
CommondityImage =? ? models.ImageField('商品圖片', upload_to='static',? ? default='static/upload/None/no-img.jpg')
CommodityDateTime =? ? models.DateTimeField('登記日期', auto_now_add=True)
CommodityContent = models.TextField('商品說(shuō)明', blank=True, null=True)
CommondityContactMobile =? ? models.CharField('聯(lián)系電話', max_length=11,? ? blank=True, null=True)
def __str__(self):
return? ? self.CommodityName#一般系統(tǒng)默認(rèn)使用來(lái)表示對(duì)象,通過(guò)這個(gè)函數(shù)可以告訴系統(tǒng)使用CommodityName字段來(lái)表示這個(gè)對(duì)象
class Meta:
verbose_name = '商品' #給模型起個(gè)更好聽(tīng)的名字绒极,這兒相當(dāng)于進(jìn)行了漢化。
verbose_name_plural = '所有商品'
#按時(shí)間下降排序
ordering =? ? ['-CommodityDateTime']
在WebStore根目錄下蔬捷,用終端命令行輸入以下指令:
$ python? ? manage.py runserver#啟動(dòng)Django中的開(kāi)發(fā)服務(wù)器
啟動(dòng)瀏覽器,輸入http://127.0.0.1:8000/,就可以訪問(wèn)網(wǎng)站了集峦。
在WebStore根目錄下,用終端命令行輸入以下指令:
python
manage.py migrate #同步在model中建立的數(shù)據(jù)庫(kù)
如果對(duì)model進(jìn)行了修改抠刺,需要先執(zhí)行一次makemigrations命令塔淤,再執(zhí)行migrae。
python
manage.py makemigrations #先檢查更新
Django有一個(gè)優(yōu)秀的特性,內(nèi)置了Django admin后臺(tái)管理界面,方便管理者進(jìn)行添加和刪除網(wǎng)站的內(nèi)容.新建的項(xiàng)目系統(tǒng)已經(jīng)為我們?cè)O(shè)置好了后臺(tái)管理功能速妖,可以在WebStore/WebStore/setting.py中查看高蜂。
在WebStore/commodity/admin.py中增加代碼,讓后臺(tái)管理界面能對(duì)“商品”信息進(jìn)行管理罕容。默認(rèn)管理界面中僅顯示上面這是的“CommodityName”备恤,為更方便的在后臺(tái)管理信息,需要增加一些一些代碼锦秒。具體的如下:
from? ? django.contrib import admin
from commodity.models? ? import Commondity
class? ? AdminCommondity(admin.ModelAdmin):
list_display =? ? ('CommodityName','CommodityCategory','CommodityPrice','CommodityDateTime')#后臺(tái)顯示的列表內(nèi)容
search_fields = ('CommodityName',? ? 'CommodityCategory',)#從哪些字段中搜索
list_filter =? ? ('CommodityCategory','CommodityDateTime',)#篩選器
admin.site.register(Commondity,AdminCommondity)
初次登陸后臺(tái)管理界面露泊,需要使用如下命令賬號(hào)創(chuàng)建超級(jí)用戶:
python
manage.py createsuperuser
按照提示輸入用戶名、郵箱旅择、密碼惭笑,創(chuàng)建第一個(gè)超級(jí)用戶。
在commodity目錄下創(chuàng)建template目錄生真,在template下增加base.html,做為本文程序的基礎(chǔ)模版沉噩。模版樣式采用Bootstrap樣式表。
4.12編寫(xiě)首頁(yè)和商品展示頁(yè)(模板)
用{% extends "base.html" %}引入模版頁(yè)面柱蟀,增加需要展示商品的相關(guān)代碼川蒙。
首頁(yè)為index.html。<代碼見(jiàn)附錄>
商品展示頁(yè)為post.html长已。<代碼見(jiàn)附錄>
通常訪問(wèn)網(wǎng)頁(yè)程序的邏輯是:request進(jìn)來(lái)->從服務(wù)器獲取數(shù)據(jù)->處理數(shù)據(jù)->把網(wǎng)頁(yè)呈現(xiàn)出來(lái)畜眨,Django也是按照這個(gè)流程來(lái)處理信息的昼牛,它使用url和views來(lái)處理:
1)url設(shè)置相當(dāng)于客戶端向服務(wù)器發(fā)出request請(qǐng)求的入口,并用來(lái)指明要調(diào)用的程序邏輯.
2)views用來(lái)處理程序邏輯,然后呈現(xiàn)到template(一般為GET方法, POST方法略有不同)。
3)template一般為html+CSS的形式,主要是呈現(xiàn)給用戶的表現(xiàn)形式康聂。
Django中views里面的代碼就是一個(gè)一個(gè)函數(shù)邏輯,處理客戶端(瀏覽器)發(fā)送的HTTPRequest,然后返回HTTPResponse匾嘱。我們?cè)赪ebStore/commodity/views.py中編寫(xiě)簡(jiǎn)單的邏輯:
from? ? django.http import HttpResponse
from? ? commodity.models import Commondity
from? ? datetime import datetime
from? ? django.http import Http404
from? ? django.shortcuts import render
from? ? django.core.paginator import PageNotAnInteger, Paginato
def
list(request):#系統(tǒng)默認(rèn)的Paginator
limit = 3#每頁(yè)顯示的記錄數(shù)
post_list = Commondity.objects.all()#獲取全部對(duì)象
paginator = Paginator(post_list,? ? limit)#實(shí)例化一個(gè)分頁(yè)對(duì)象
page = request.GET.get('page')#獲取頁(yè)碼
try:
post_list =? ? paginator.page(page)#獲取某頁(yè)對(duì)應(yīng)的記錄
except PageNotAnInteger:#如果頁(yè)碼不是個(gè)整數(shù)
post_list = paginator.page(1)#取第一頁(yè)的記錄
except EmptyPage:#如果頁(yè)碼太大,沒(méi)有相應(yīng)的記錄
post_list =? ? paginator.page(paginator.num_pages)#取最后一頁(yè)的記錄
return render(request,'list.html',? ? {'post_list': post_list})
def? ? index(request):
post_index = Commondity.objects.all()[:8]#獲取全部對(duì)象,僅顯示前8條數(shù)據(jù)
return? ? render(request,'index.html',{'post_index':post_index})
def? ? detail(request, id):
try:
post =? ? Commondity.objects.get(id=str(id))
except Commondity.DoesNotExist:
raise Http404
return render(request, 'post.html',? ? {'post': post})
用{% extends "base.html" %}引入模版頁(yè)面早抠,增加需要展示商品的相關(guān)代碼霎烙。
在views.py中使用pagination,實(shí)現(xiàn)簡(jiǎn)單分頁(yè)蕊连。<代碼見(jiàn)附錄>
商品展示頁(yè)為post.html悬垃。<代碼見(jiàn)附錄>
如何使這個(gè)邏輯在http請(qǐng)求進(jìn)入時(shí),被調(diào)用呢,這里需要WebStore/WebStore/urls.py中進(jìn)行url設(shè)置,設(shè)置了訪問(wèn)主頁(yè)(list.html)和商品詳情頁(yè)面(post.html)甘苍。代碼如下:
from? ? django.conf.urls import url,include
from? ? django.contrib import admin
from
commodity import views #1.8以上新的寫(xiě)法
urlpatterns? ? = (
url(r'^admin/', admin.site.urls),
url(r'^$',? ? views.index,name='index'),# alex:1.8以上新的寫(xiě)法
url(? ? r'^(?P\d+)/$',views.detail, name='detail'),
url(r'^list/$',views.list),
)
Django官方網(wǎng)站:https://docs.djangoproject.com/en/1.11/
Django基礎(chǔ)教程:http://code.ziqiangxuetang.com/django/django-tutorial.html
[1]在windows下可以使用django-admin
startproject WebStore的命令尝蠕,無(wú)py后綴。