WSGI介紹
HTTP協議和HTML的介紹不在這裏說明,可以去看廖雪峯老師的教程瞭解這方面內容。
一個web應用的本質是:
- 瀏覽器發送一個HTTP請求
- 服務器收到請求,生成一個HTML文檔
- 服務器把HTML文檔作爲HTTP響應的Body發送給瀏覽器
- 瀏覽器收到HTTP響應,從HTTP響應Body中取出HTML並顯示
最簡單的web應用就是先把HTML保存好,然後需要時直接響應給HTTP請求。
對Python而言,正確的做法是底層代碼由專門的服務器軟件實現,我們只需用Python專注於生成HTML文檔即可。
Python提供了同一的接口WSGI
即Web Server Gateway Interface
讓我們去專注於如何生成HTML文檔。
接口非常簡單,它要求web開發者實現一個函數,就是響應HTTP請求。如下所示。
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']
environ 是包含所有HTTP請求信息的dict對象。
start_response 是發送HTTP響應的函數。start_response用於發送HTTP響應Header, 只能發送一次, 接收兩個參數, 第一個參數是響應碼, 第二個參數是響應Header
我們需要一個WSGI服務器來測試我們上面寫的代碼。Python內置了一個WSGI服務器,這個模塊叫wsgiref
,它是用純Python編寫的WSGI服務器的參考實現。所謂“參考實現”是指該實現完全符合WSGI標準,但是不考慮任何運行效率,僅供開發和測試使用。
# -*- coding: UTF-8 -*-
def application(environ, start_response):
"""
environ 是包含所有HTTP請求信息的dict對象
start_response 是發送HTTP響應的函數
start_response用於發送HTTP響應Header, 只能發送一次, 接收兩個參數, 第一個參數是響應碼, 第二個參數是響應Header
:param environ:
:param start_response:
:return:
"""
# HTTP請求信息也放在environ裏, 只不過有HTTP_前綴 如HTTP_USER_AGENT
# print(environ)
print("JAVA_HOME={}".format(environ.get("JAVA_HOME")))
print("USER_AGENT={}".format(environ.get("HTTP_USER_AGENT")))
# 發送HTTP Response Header
start_response('200 OK', [('Conten-Type', 'text/html')])
content = '<h1>hello {} on web!</h1>'.format(environ.get("USERNAME"))
return [content.encode()]
from wsgiref.simple_server import make_server
# 創建服務器
httpd = make_server("localhost", 8080, application)
print("Serving HTTP on port 8080 ...")
# 開始監聽HTTP請求
httpd.serve_forever()
Flask框架簡單使用
介紹瞭如何定義url對應的處理方法、如何傳參、如何重定向、如何接收和發送json數據。
更詳細內容可以參考W3CSchool教程
# -*- coding: UTF-8 -*-
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/')
def index():
content = {"code": "ok", "msg": "Hello World"}
return content
@app.route('/index.html')
def index_html():
return "<h1>hello everyone</h1>"
@app.route('/hello/<name>')
def hello(name):
return "hello {}".format(name)
@app.route('/blog/<int:id>')
def blog(id):
return "the blog id is %s" % id
@app.route('/money/<float:money>')
def money(money):
return "the money is %s" % money
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
# 重定向
@app.route('/user/<name>')
def hello_user(name):
if name =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest',guest = name))
@app.route("/stu/add", methods=['POST'])
def add():
print(request.get_data())
# 獲取json數據
print(request.get_json())
return "ok"
app.run(host="192.168.10.44", port=8080, debug=True)