本章的主題為建立一個自己的個人網站。
17.1 要解決什麼問題在網際網路上存在著難以計數的網站,有企業的,政府的,各類組織及個人網站的等待,那麼我們能否給自己建立一個網站呢?這當然肯定是沒問題的,搭建個人網站有很多選擇。我們既然在學Python,那麼就利用Python的Django來為我們自己建立一個網站。
當然了,網站和網站之間的差異也很大。比如新聞類的網站,可能只是提供了很多頁面用於展示新聞資訊,而一些訂火車票訂機票類的網站,就需要比較複雜的技術。而個人網站,大多就是用幾個頁面來展示一些資訊。
17.2 實現思路要搭建一個個人網站,我們需要做哪些工作呢?
17.3.1 Django模組Django是一個Python實現的開源Web伺服器框架,提供了基本檢視,模型和模板。基於該框架,我們可以很容易的構建一個網站應用。相對於下節將要提到的Tornado來說,Django是一個重量級的Web伺服器框架,功能非常全面,有利於開發複雜的網站。模型提供了對應用資料結構的抽象,而檢視用於處理一個使用者的請求,並返回響應。模板則提供了一個設計友好的render語法,用於向用戶顯示資訊。
可以通過pip命令進行安裝。
pip install django如果想要更深入的學習了解,可以通過下面的連結。
17.3.2 Tornado模組Tornado是一個當前比較流行的開源Web伺服器框架,其優勢在於實現了一個非阻塞式服務框架。其底層實現是基於C語言的epoll技術,因此效能極好。在一些大型線上遊戲中,也使用該框架進行遊戲伺服器端開發,因此在效能方面完全支援企業級應用。
可以通過pip命令進行安裝,安裝命令如下。
pip install tornado這裡有一個基於Tornado實現的,簡單的"Hello world"的web例子。
import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")def make_app(): return tornado.web.Application([ (r"/", MainHandler), ])if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()更多關於Tornado模組的詳細資訊可以參考下面的連結。
17.4 程式碼實現到這裡,我們開始具體實現我們自己的個人網站了。
17.4.1 通過Django來建立網站我們這裡通過Pycharm IDE來建立Django工程,如果沒有安裝Pycharm也可以通過命令列進行建立,稍後會進行介紹。
通過File->New Project,我們可以看到如下所示的介面。
圖17-1 建立Django工程
建立成功後,我們可以看到如下圖17-2所示的介面,左側是工程目錄,可以看到有一個django_sites目錄,在該目錄有兩個子目錄django_sites和person_web,在django_sites目錄下分別是settings.py負責專案配置,urls.py路由模組和wsgi.py網路通訊模組。person_web子目錄下分別是admin.py負責使用者許可權,models負責資料模型,views.py負責業務邏輯。另外還有一個sqlite3的資料庫檔案db.sqlite3,一個manage.py檔案。
圖17-2 Django工程
接下來,我們需要進入工程目錄,然後執行下面的命令,對資料儲存服務進行初始化。
>cd django_sitesdjango_sites>python manage.py migrateOperations to perform:Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying sessions.0001_initial... OK
到這裡,萬事俱備只欠東風,通過下面的命令我們可以執行該django server了。
python manage.py runserver
執行上面命令後,將會啟動Django server。在瀏覽器中輸入http://127.0.0.1:8000/可以開啟如下圖17-3所示的介面,表示Django已經可以正常執行。
圖17-3 Django Debug模式介面
當然了,我們也可以完全通過命令列進行上面的操作,大致過程如下。
輸入如下指令,建立一個Django專案django_sites。
django-admin startproject django_sites執行成功後,進入django_sites目錄,通過下面的命令對資料儲存服務進行初始化。
python manage.py migrate緊接著,輸入如下指令啟動伺服器。
python manage.py runserver下面就可以通過瀏覽器進行訪問了,但這僅僅是讓Django服務執行起來了,我們還需要實現自己的頁面。
在開始使用自己定義的主頁前,需要將settings.py檔案中的DEBUG修改為False,並且需要在ALLOWED_HOSTS中新增執行訪問的主機IP地址,如下所示,0.0.0.0表示執行任何主機訪問。
# SECURITY WARNING: don't run with debug turned on in production!DEBUG = FalseALLOWED_HOSTS = ["0.0.0.0"]17.4.2 通過Tornado來建立網站本節我們介紹如何通過Tornado來建立網站, 程式碼結構比Django簡單的多,個人更喜歡Tornado來實現網站。下面程式碼段展示了如何實現一個http伺服器端,後面緊接著會展示如何實現一個https伺服器端。
# -*- coding=utf-8 -*-import osfrom tornado import gen, webfrom tornado import httpserverfrom tornado import ioloopclass MainHandler(web.RequestHandler): def data_received(self, chunk): pass @gen.coroutine def get(self): self.render("login.html") @gen.coroutine def post(self): print(self.request) print(self.request.remote_ip) print(self.get_argument('user')) print(self.get_argument('password')) self.render("success.html") passdef main(): settings = { "static_path": os.path.join(os.path.dirname(__file__), "static"), } application = web.Application([(r"/", MainHandler), ], autoreload=True, **settings) server = httpserver.HTTPServer(application) server.listen(8000) ioloop.IOLoop.instance().start()if __name__ == '__main__': main()下面的伺服器端支援https,因此需要證書檔案。# -*- coding=utf-8 -*-import osfrom tornado import gen, webfrom tornado import httpserverfrom tornado import ioloopclass MainHandler(web.RequestHandler): def data_received(self, chunk): pass @gen.coroutine def get(self): self.render("login.html") @gen.coroutine def post(self): print(self.request) print(self.request.remote_ip) print(self.get_argument('user')) print(self.get_argument('password')) self.render("success.html") passdef main(): settings = { "static_path": os.path.join(os.path.dirname(__file__), "static"), } application = web.Application([(r"/", MainHandler), ], autoreload=True, **settings) server = httpserver.HTTPServer(application, ssl_options={ "certfile": os.path.join(os.path.abspath("."), "server.crt"), "keyfile": os.path.join(os.path.abspath("."), "server.key"), }) server.listen(8000) ioloop.IOLoop.instance().start()if __name__ == '__main__': main()啟動該程式碼後,我們可以通過瀏覽器進行訪問,會得到如圖17-4所示介面,可以看到是一個簡單的登陸介面,需要輸入使用者名稱和密碼。這裡,我們隨便輸入一個使用者名稱和密碼,會得到如圖17-5所示介面,顯示登陸成功。接下來,我們可以看看登陸頁面的程式碼。
圖17-4 Tornado實現的登陸介面
圖17-5 Tornado登陸介面的響應
從上面伺服器端的程式碼實現,我們可以知道,get()方法只是簡單的顯示login.html頁面,而post()方法則是列印訪問的遠端IP地址和使用者輸入的使用者名稱密碼後,直接顯示success.html頁面。
login.html頁面的程式碼實現如下所示。