按照作家韓寒的說法,這個世界存在兩種邏輯,一種是邏輯,另外一種是中國邏輯。中國由于“特色”,跟世界是不同的。在網絡上,也是如此,世界的網絡和中國的網絡有很大不同,不用多說,看官應該體會到了。那么,我這里的標題是“問候世界”,就當然不包括中國了。
已經用Tornado可以在自己的計算機上發布網站了,也就是能夠在自己計算機的瀏覽器地址欄中輸入`http://localhost:8000`,顯示那個Hello,這僅僅是向自己問候了。如果要向世界問候,就需要把這個那個程序放到連接到互聯網的服務器上。
在網上,有很多提供服務器租賃服務的公司,可以購買虛擬空間、VPS,現在比較時髦的就是購買云服務主機等,當然,有錢的就自己買服務器硬件設備,然后自己建立機房了。我這里演示給諸位的,不是上面這些,是按照窮人的思路來解決問題。
Google是偉大的,誰要不認同,我就跟誰急。除了因為它是一個好的搜索引擎之外,還因為它給我提供了免費的GAE。什么是GAE?GAE就是Google App Engine,維基百科上這樣說的:
> Google App Engine是一個開發、托管網絡應用程序的平臺,使用Google管理的數據中心。它在2008年4月發布了第一個beta版本。
>
> Google App Engine使用了云計算技術。它跨越多個服務器和數據中心來虛擬化應用程序。[1] 其他基于云的平臺還有Amazon Web Services和微軟的Azure服務平臺等。
>
> Google App Engine在用戶使用一定的資源時是免費的。支付額外的費用可以獲得應用程序所需的更多的存儲空間、帶寬或是CPU負載。
看官注意了,上面那誘人的“免費”,盡管有所限制,但是,已經足夠一般用戶使用了,下面是免費內容,看看是不是足夠慷慨了呀。
| 項目 | 配額 |
| --- | --- |
| 每天的Email數量 | 100封 |
| 每天的輸入數據 | 無限 |
| 每天的輸出數據 | 1 GB |
| 每天可使用CPU | 28小時 |
| 每天調用Datastore API次數 | 50000次 |
| 數據存儲 | 1 GB |
| 每天調用URLFetch API次數 | 657000次 |
如果你做一個網站,超過了上面的免費配額,說明你的網站已經不小了。也能夠掙錢或者找風險投資了。中國的互聯網上,尚未見到如此慷慨的,雖然也有自吹自擂的公司。
請看官注意,這個服務只能在世界范圍內使用,由于你知道和不知道的原因,在中國不能使用。當然,要立志做一個優秀程序員的,一定要能夠進入世界范圍。
**欲進入世界,必科學上網**
否則,今天這一講看官就無法學習。
## 官方網站
在進入學習之前,請看官登錄GAE官方網站瀏覽:[https://cloud.google.com/appengine/docs?hl=zh-cn](https://cloud.google.com/appengine/docs?hl=zh-cn)
目前GAE支持使用的語言有:Java,Python,PHP,Go
我在這里當然是使用python了。雖然,我也喜歡PHP。
如果看官自己有能力閱讀文檔,直接在該網站上閱讀,就能夠學會如何使用GAE了,不必看我下面的啰嗦。我認為GAE網站上講的很好了。不過,就是有一點不足,缺少趣味性。如果要享受胡扯的東西,就看我的課程啦。
## 注冊
在上面的GAE官方文檔中,看到下面圖片中的`Try it now`按鈕,點它,進入下一個界面。
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30901.png)
進入的新頁面中,開頭有這樣一段。
> Try Google App Engine Now
>
> Creating an App Engine app is easy, and it's free to start. Upload your app and share it with users right away, at no charge and with no commitment required.
看下面的圖
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30902.png)
首先給自己的網站取一個名字,當然這個名字以后還可以修改呢。
然后,在四種語言中選擇一種,一定要選python,選別的不跟你玩了。
選好之后,看第三步,如下圖。其實是一個例子罷了。不過,不是用tornado框架的。
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30903.png)
## 下載SDK
下載SDK,看操作系統,不同的操作系統有不同的下載安裝方法。如下兩圖所示中,都說明了安裝流程。
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30904.png)
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/39005.png)
我的操作系統是ubuntu,就選擇按照上面那張圖的方式安裝。特別提醒,一定要讓你的計算機用VPN科學上網,才能實現上面的安裝流程。
從新打開一個shell, 按照上面要求,輸入`curl https://sdk.cloud.google.com/ | bash`,剩下的事情就是根據shell中提示的信息向下進行了。它要詢問是否需要幫助的時候,就輸入y,然后選擇語言(2,是python and php,也就是按照這種方法安裝的SDK是python和php兩者都可以使用的),還要輸入一個放置SDK文件的目錄名稱。之后,系統就自動將google-cloud-sdk中的很多東西,放到指定目錄中了。在安裝過程中,還會詢問工作環境,不修改用自動設置的,簡單地回車即可。
如果網絡差點,需要等待一段時間。最終在你指定的目錄中會有一個google-cloud-sdk目錄,所要安裝的內容全在里面了。
還可以到:[https://cloud.google.com/appengine/downloads?hl=zh-cn](https://cloud.google.com/appengine/downloads?hl=zh-cn)
下載,這個頁面也有安裝幫助。安裝方法可以是:
1. 將下載的文件解壓,并存儲到本地計算機中的某個目錄內,比如我在前面安裝的時候,就個放置google-cloud-sdk的目錄命名為GAEPython,這里所說的目錄,就跟前面的效能一樣。
2. 設置本用戶的工作環境,就是要在當前用戶主目錄下的.bashrc中設置路徑。方法是:用戶主目錄下的.bashrc文件(有的linux是.profile文件),用vim打開該文件,并進入編輯模式,在文件最后加入PATH設置,參考格式`export PATH="$PATH:your path1/:your path2/ ..."`,然后保存,并退出該shell,則變量生效,本添加的變量只對當前用戶有效。
這樣兩種方式折騰,就搞定了SDK
在上圖中,官方給的安裝流程中,接下來就是要用一個賬號登錄google云。關閉前面安裝時使用的shell,然后新打開一個,輸入命令`gcloud auth login`,會打開瀏覽器,出現下圖
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30906.png)
我也不用別的賬號,就直接用“老齊”那個賬號,點擊之,進入一個授權界面,也不用怎么仔細看,要想用,就得點擊網頁最下面的“接受”,否則別用。網站都是這么忽悠人的。我不截圖了,看官除了要科學上網,這里不會有問題的吧。然后看到下面的界面,就成功了。
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30907.png)
在這個頁面中,可以了解很多關于google云平臺的內容以及操作方法。
因為我以前已經建立了一下項目,所以,我點擊這個頁面上“轉至我的控制臺”之后,會列出我已經存在的項目名稱。當然,在這里可以新建項目。
不過,這里暫且擱置。先回到自己的計算機上。已經將gdk做好了。
## 在本地建立項目
在自己的計算機上,任何認為合適的地方,建立一個目錄,這個目錄就是你要發布到GAE上的項目名稱,例如我的操作:
~~~
qw@qw-Latitude-E4300:~/Documents$ mkdir mypy
~~~
我是在這里建立了一個名字是mypy的目錄,也就意味著我要發布的項目名稱是mypy,然后,要把tornado的東西放進這個目錄。就是這么做:
先建立一個目錄,叫做tornado_source
~~~
qw@qw-Latitude-E4300:~/Documents$ cd tornado_source
qw@qw-Latitude-E4300:~/Documents/tornado_source$ git clone https://github.com/facebook/tornado.git
正克隆到 'tornado'...
remote: Counting objects: 13952, done.
remote: Total 13952 (delta 0), reused 0 (delta 0)
接收對象中: 100% (13952/13952), 7.41 MiB | 107.00 KiB/s, done.
處理 delta 中: 100% (8877/8877), done.
檢查連接... 完成。
~~~
然后將tornado_source中的tornado目錄,移動到mypy里面去。
接下來在mypy目錄里面新建一個文件,名稱必須是:app.yaml,該文件的內容是:
~~~
application: mypy
version: 1
runtime: python27
api_version: 1
threadsafe: no
handlers:
- url: /favicon\.ico
static_files: favicon.ico
upload: favicon\.ico
- url: .*
script: main.py
~~~
關于yaml,這里也引用[維基百科的內容](http://zh.wikipedia.org/wiki/YAML),補充一下:
> YAML(IPA: /?j?m?l/,尾音類似camel駱駝)是一個可讀性高,用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822。Clark Evans在2001年首次發表了這種語言[1] ,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設計者。目前已經有數種編程語言或腳本語言支援(或者說解析)這種語言。
>
> YAML是"YAML Ain't a Markup Language"(YAML不是一種置標語言)的遞回縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種置標語言),但為了強調這種語言以數據做為中心,而不是以置標語言為重點,而用返璞詞重新命名。
YAML的官方網站:www.yaml.org
## 編寫main.py
本來根據我以前的經驗,到這里就可以運行`dev_appserver.py mypy`了。可是發現錯誤了,說沒有找到sqlite3模塊。不知道為什么,python升級之后,這個模塊沒有裝上,本來這個模塊是標準庫的。看官如果在操作過程中,也遇到類似情況。解決方法就是到該模塊的官方網站下載源碼,然后安裝,一般流程是:
~~~
tar -zxvf ***.gz
cd *** #進入解壓縮后得到的目錄
./configure #如果不使用默認的,可以指定目錄:--prefix=**/**/
make
make install #若權限不足,可以前面加sudo,得到臨時root權限。
~~~
然后,這個很重要,再將python源碼中setup.py文件中該模塊的路徑從新設置,設置為該模塊被安裝的路徑。一般情況可能是這里的模塊路徑錯了。
接下來就從新安裝python
搞定sqlite3模塊,再嘗試,我回到含有mypy項目的(/home/qw/Documents/mypy,即回到/home/qw/Documents):
~~~
dev_appserver.py mypy
~~~
結果顯示:
~~~
......
google.appengine.tools.devappserver2.wsgi_server.BindError: Unable to bind localhost:8080
~~~
原來,我科學上網,用的是8080端口,已經被占用了,google.appengine也打算用這個端口。那好,因為是在本地,就不用科學了,將科學上網端口停了,再試試。
~~~
qw@qw-Latitude-E4300:~/Documents$ dev_appserver.py mypy
INFO 2014-10-07 13:57:14,275 devappserver2.py:733] Skipping SDK update check.
WARNING 2014-10-07 13:57:14,279 api_server.py:383] Could not initialize images API; you are likely missing the Python "PIL" module.
INFO 2014-10-07 13:57:14,283 api_server.py:171] Starting API server at: http://localhost:40433
INFO 2014-10-07 13:57:14,295 dispatcher.py:186] Starting module "default" running at: http://localhost:8080
INFO 2014-10-07 13:57:14,298 admin_server.py:117] Starting admin server at: http://localhost:8000
/usr/local/lib/python2.7/site-packages/setuptools-2.2-py2.7.egg/pkg_resources.py:991: UserWarning: /home/qw/.python-eggs is writable by group/others and vulnerable to attack when used with get_resource_filename. Consider a more secure location (set with .set_extraction_path or the PYTHON_EGG_CACHE environment variable).
~~~
看下圖,如果在URL輸入`http://localhost:8000`,打開的是本地App Engine
[](https://github.com/qiwsir/ITArticles/blob/master/Pictures/30908.png)
這個就是本地的server。
如果在URL輸入`http://localhost:8080`,網頁空白,什么提示沒有。這就對了,因為我還沒有編寫那個最重要的文件,就是app.yaml里面設定的main.py
**特別提醒看官:我在上面操作的時候,出現了警告,但是當時沒有引起我的注意。于是就編寫main.py文件。結果,運行`http://localhost:8080`,不成功。而且告訴我無法找到tornado.wsgi模塊。**
本講有懸念了。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python