首頁>技術>

本章的主題為建立一個自己的個人網站。

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頁面的程式碼實現如下所示。

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何檢視Docker容器環境變數,如何向容器傳遞環境變數