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)