在上節課里,我們在coding.net里使用hexo搭建了自己的播客。播客是典型的靜態網站,網站里每個頁面的內容都是一成不變的。這節課,我們一起學習一下怎么使用python搭建動態網站。
## 動態網站核心技術
所謂動態網站,是指網頁里的數據每天甚至每時每刻會發生變化的。比如我們看的QQ空間、微博等等。所以,相比于我們上節課學習的內容,我們會增加一個新的傳輸后臺數據的服務。因此,動態網站核心上有這樣幾部分組成:
1. web頁面:這個就是我們上節課學習的網頁開發核心技術。
2. 數據服務:網頁上動態的數據接口,這個是我們這節課學習的flask
3. 數據存儲:動態數據存儲位置,一般會存儲在數據庫中,放了方便學習,我們這里直接把數據存儲在文件中。

## flask
在講什么是flask之前,我先來看一個小demo:
```
from flask import *
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
```
這就是我們使用寫一個動態網站的核心代碼,代碼運行后,我們訪問:` http://127.0.0.1:5000/ ` 頁面就可以打開自己開發的網站了。

## flask核心模塊介紹
有了對flask的直觀印象后,我們來詳細學習一下什么是flask。
1. flask是什么
flask官方對自己的介紹如下:
> Flask是一個使用Python編寫的輕量級Web應用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。
簡單來說,flask就是一個針對網頁的服務端框架,內置一個渲染html的引擎。通過flask,我們可以把:響應http的url請求、加工服務端數據和返回html內容整合在一起的一個web服務框架。
2. 安裝flask
有了pip,安裝flask非常簡單,我們只需要`pip install Flask`命令即可完成flask的安裝。
3. flask核心方法
從上面的demo代碼中,我們可以看出,flask核心有這樣幾部分組成:
1)引入flask `from flask import *`
2)定義flask對象 `app = Flask(__name__)`
3)編寫響應url路徑的函數
```
@app.route('/')
def hello_world():
return 'hello world'
```
注意看,這個代碼,相比于我們正常編寫的函數,多了一個`@app.route('/')` 注解,這個注解的意思就是這個函數應該響應我們url請求的哪個路徑。
4)運行flask程序`app.run()`
## 任務清單項目實例
下面,我們通過網頁版任務清單項目。來完整體驗一下flask的完整開發流程。
1. 新建flask項目,注意看,pycharm已經很智能的把todo.py幫我們創建好了,里面已經有了flask的核心代碼。
2. 任務清單類todo
項目的核心邏輯是任務清單的維護,我們新增todo類,看代碼:
```
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Todo:
def __init__(self):
self.taskList = []
self.__fileLocation__ = "./todo.txt"
self.__loadTask__()
def addTodo(self, thing):
self.taskList.append(thing)
self.__saveTodo__()
return True
def removeTodo(self, thing):
if not thing in self.taskList:
return False
else:
self.taskList.remove(thing)
self.__saveTodo__()
return True
def searchTodo(self, thing):
for todo in self.taskList:
if thing in todo:
return todo
return None
def getAllToto(self):
return self.taskList
def __loadTask__(self):
file = open(self.__fileLocation__, 'r')
# 換行符
self.taskList = []
for task in file.readlines():
self.taskList.append(task.replace('\n', ''))
def __saveTodo__(self):
file = open(self.__fileLocation__, 'w')
file.write('\n'.join(self.taskList))
file.close()
```
todo類完成了對任務清單的查詢、新增、刪除、修改等操作。
3. 寫任務列表頁面
我們在templates目錄里新增index.html文件。在里面增加展示任務列表的代碼:
```
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>任務清單</title>
</head>
<body>
<p>
任務任務<a href="/delete?todo=">刪除</a>
</p>
<p>
任務任務<a href="/delete?todo=">刪除</a>
</p>
<form action="/insert" method="post">
<input type="text" name="todo">
<button type="submit">新增</button>
</form>
</body>
</html>
```
4. 替換成動態數據
第三部做的網頁是靜態的,我們需要從服端獲取數據,因此現在todo.py 里新增獲取數據的方法:
```
from Todo import *
todo = Todo()
@app.route('/')
def list():
return render_template('index.html', todoList=todo.getAllToto())
```
這個函數在獲取數據后,會將數據渲染到index.html頁面中并返回瀏覽器。html里的代碼對應改動如下:
```
{% for todo in todoList %}
<p>
{{ todo }}
<a href="/delete?todo={{todo}}">刪除</a>
</p>
{% endfor %}
```
注意看 `{%}`的語法。這個就是html加載python返回數據的Jinja2模板代碼了。
5. 新增任務
新增任務首先需要在網頁里增加一個form表單:
```
<form action="/insert" method="post">
<input type="text" name="todo">
<button type="submit">新增</button>
</form>
```
對應的python處理如下:
```
@app.route('/insert', methods=['POST'])
def insert():
task = request.form['todo']
todo.addTodo(task)
return render_template('index.html', todoList=todo.getAllToto())
```
注意這點代碼:
1)我們在注解里指定了需要響應的是post請求。
2)在inset的方法體內,我們使用`request.form['todo']` 語法來獲取網頁提交的數據。
6. 刪除任務
刪除任務和新增數據類似,我們來看python代碼:
```
@app.route('/delete')
def delete():
task = request.args.get('todo', '')
todo.removeTodo(task)
return render_template('index.html', todoList=todo.getAllToto())
```
到現在為止,我們的網頁版任務清單就開發完成了。

## 淘寶是怎么開發的?
那像淘寶一樣復雜的網站是怎么開發的呢?只要我們掌握了web開發的核心知識,淘寶網站也是像這樣的邏輯一個功能一個功能開發完成的。就像升級打怪,我們只要一級一級的提高自己,就能開發出像淘寶、微博一樣復雜的網站。

**阿達老師-孩子身邊的編程專家**
*完整課程請關注阿達老師,主頁里有完整的課程目錄和觀看地址*
- 課程介紹
- 搭建環境
- 什么是計算機
- 程序是怎么運行的
- 安裝python
- 項目實例-安裝IDE
- 變量和簡單數據類型
- 數據&變量
- 數字
- 字符串
- 布爾類型
- 項目實例
- 容器-列表
- 容器
- 列表
- 項目實例
- 容器-字典
- 定義字典
- 項目實例
- 數據類型總結
- 條件語句
- python條件語句
- 項目實例
- 循環語句
- for循環
- while循環
- 項目實例
- 函數
- 5.0函數定義
- 5.2函數實戰
- 6.文件系統
- 6.1 文件系統介紹&python查找文件
- 6.2 用python讀寫文件
- 7. python操作時間
- 8.面向對象
- 8.1 類和對象
- 8.2 繼承和重寫
- 8.3 面向對象項目實戰
- 9 GUI編程
- 9.1 GUI基礎
- 9.2 備忘清單GUI版
- 10.網絡
- 10.1 網絡的發展
- 10.2 python http
- 11.web開發
- 11.1 web基礎&HTML
- 11.2 CSS&JavaScript
- 11.3 網頁計算器
- 11.3 網站開發實戰-播客搭建
- 11.3 python-web
- 12. 項目實戰-數據處理
- 13. 項目實戰-AI入門
- 13.1 環境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 動畫基礎 Animation
- 從0開始學python第14.5節 pygame 加載圖片和聲音
- 從0開始學python第14.6節 pygame.sprite(上)
- 14.7 pygame.sprite模塊(下)
- 14.8 pygame射擊游戲(一)
- pygame射擊游戲(二)
- 14.8 pygame射擊游戲(三)
- 14.8 pygame射擊游戲(四)
- 14.8 pygame射擊游戲(五)