本次的軟件工程實踐,我負責我們組后台服務的搭建,我選用了bandwagon的服務器,安裝的是Debian GNU/Linux,全程在root用戶下操作,后端服務是用python的flask框架,數據庫用的是postgres,內容會慢慢都添加上去。
本地登錄遠程服務器
在本地登錄遠程服務器現在主要用的是SSH。
Secure Shell(縮寫為SSH),由IETF的網絡工作小組(Network Working Group)所制定;SSH為一項創建在應用層和傳輸層基礎上的安全協議,為計算機上的Shell(殼層)提供安全的傳輸和使用環境。
Windows上的SSH工具有PuTTY,SecureCRT和Xshell等,我選用的是Xshell。一般服務器的提供商都會把初始的ssh端口和root密碼告訴你,你就可以用SSH登錄服務器了。
打開Xshell,點擊會話左上角的新建。
在主機框里寫上服務器的ip地址,端口號寫SSH的端口號,
點擊用戶身份驗證,填寫用戶名和密碼,用戶名寫root,密碼寫初始的root密碼(也可以用自己創建的用戶登錄)。
點擊確定,然后連接,成功后如下圖。
接下來就可以用Linux的各種命令操作服務器了。
flask框架
Flask是一個使用Python編寫的輕量級Web應用框架。基於Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授權。flask被稱為microframework,因為它只需要幾十行代碼就能寫出一個web應用。以“Hello World”為例子。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
運行之后:
這段代碼做了五件事:
1.首先,我們導入了 Flask 類。這個類的實例將會是我們的 WSGI 應用程序。
2.接下來,我們創建一個該類的實例,第一個參數是應用模塊或者包的名稱。 如果你使用單一的模塊(如本例),你應該使用 name ,因為模塊的名稱將會因其作為單獨應用啟動還是作為模塊導入而有不同( 也即是 'main' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態文件等等。詳情見 Flask 的文檔。
3.然后,我們使用 route() 裝飾器告訴 Flask 什么樣的URL 能觸發我們的函數。
4.這個函數的名字也在生成 URL 時被特定的函數采用,這個函數返回我們想要顯示在用戶瀏覽器中的信息。
5.最后我們用 run() 函數來讓應用運行在本地服務器上。 其中 if name == 'main': 確保服務器只會在該腳本被 Python 解釋器直接執行的時候才會運行,而不是作為模塊導入的時候。
這就是一個最簡單的flask應用,其他東西都可以在它上面擴展。
下面就以課堂作業通訊錄為例子講一下。
在這個例子里我寫了七個接口,我就挑兩個個講一下
渲染主html。flask可以通過render_template,直接把同目錄的templates文件里的html文件渲染出來。
@application.route('/student')
def index():
return render_template('student.html')
添加信息。url設置為'/add',請求方式為POST,由於使用的是sqlite3數據庫,所以要import sqlite3,用con連接數據庫,cursor設置游標,然后讀取request的data,也就是發過來請求body的數據,再將數據插入表中,如果成功返回鍵finished的值為true,失敗為false。
@application.route('/add', methods = ['POST']) # 添加學生信息
def add_stu():
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
data = request.get_data()
data = data.decode("utf-8")
dict = json.loads(data)
values = (dict['name'],dict['address'],dict['phone'],dict['wechat'],
dict['mail'],dict['qq'],dict['note']) # 接受前端發送的信息
print(values)
try:
cursor.execute('''insert into student(name,address,phone,wechat,mail,qq,note)
values(?,?,?,?,?,?,?)''',values)
cursor.close()
conn.commit()
conn.close()
return jsonify({'finished': 'true'})
except:
cursor.close()
conn.commit()
conn.close()
print("Error: unable to insert data")
return jsonify({'finished': 'false'}
光有一個python文件是不足以運行程序的,即使運行了速度也很慢,所以需要把它掛在服務器軟件上,flask應用經常用gunicorn部署,用nginx來反向代理,這樣的話接受請求速度就快多了,也更安全穩定。gunicorn可以用pip安裝,而nginx也可用apt-get安裝。
如果要用gunicorn啟動服務需要在應用里這樣寫:
from flask_script import Manager
······
def create_app():
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
return app
application = create_app()
······
if __name__ == '__main__':
application.run()
在命令行里運行:
gunicorn -D(后台運行) -w 3(開三個進程) - b 127.0.0.1:5000(運行的地址和端口) app:application(配置文件名)
這樣應用就運行起來了。
配置nginx就要復雜一點
裝好之后命令:nginx -t
可以看到配置文件在/etc/nginx/nginx.conf,修改它,加入:
server{
listen 5001;
server_name 服務器地址;
location /{
proxy_pass http://127.0.0.1:5000;
}
}
配置完之后運行 nginx -t ,成功后再運行 service nginx restart ,然后就可以在服務器的5001端口訪問到服務了。
參考:
https://zh.wikipedia.org/wiki/Flask
http://docs.jinkan.org/docs/flask/patterns/sqlalchemy.html
http://blog.csdn.net/qq_32198277/article/details/52432890