Python簡單Web開發

WSGI介紹

HTTP協議和HTML的介紹不在這裏說明,可以去看廖雪峯老師的教程瞭解這方面內容。

一個web應用的本質是:

  • 瀏覽器發送一個HTTP請求
  • 服務器收到請求,生成一個HTML文檔
  • 服務器把HTML文檔作爲HTTP響應的Body發送給瀏覽器
  • 瀏覽器收到HTTP響應,從HTTP響應Body中取出HTML並顯示

最簡單的web應用就是先把HTML保存好,然後需要時直接響應給HTTP請求。
對Python而言,正確的做法是底層代碼由專門的服務器軟件實現,我們只需用Python專注於生成HTML文檔即可。
Python提供了同一的接口WSGIWeb 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)



參考網址

廖雪峯老師的Python教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章