参考原文

  Python廖雪峰

WSGI接口

  WSGI(Web Server Gateway Interface)是一个接口,用来屏蔽底部的细节(如TCP的建立连接,HTTP原始请求和响应格式等)。WSGI接口定义非常简单,只需要Web开发者实现一个函数,就可以响应客户端的HTTP请求

  这个函数有两个参数:environ:包含所有的HTTTP请求的dict对象;start_response:一个发送HTTP响应的函数。

这两个参数,我们是没有办法提供的,是需要符合WSGI规范的服务器来提供的。

  Python内置了一个WSGI服务器,这个模块就wsgiref,是用纯Python编写的,不考虑任何的运行效率,仅供开发和测试使用。接下来,我们就来实现一个基本的响应请求的处理。

  首先,编写hello.py,用于实现Web应用程序的WSGI处理函数:

#hello.py

def application(environ, start_response):
#返回响应的首部
start_response('200 OK',[('Content-Type', 'text/html')])
#返回响应的主体
return [b'<h1>Hello,world<h1>']

  再编写一个server.py,用于启动WSGI服务器,加载application()函数:

#server.py
#导入响应的模块函数:
from wsgiref.simple_server import make_server
#导入先前编写的application函数:
from hello import application #创建一个服务器,IP地址为空,渡口是8000,处理函数是application
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
#开始监听HTTP请求:
httpd.serve_forever()

  在终端运行server.py,并在浏览器输入地址:localhost:8000,效果如下图:

  在命令行可以看到wsgiref打印的log:

  我们也可以根据environ里的参数信息,来生成动态的HTML。

  总结:无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。

使用Web框架

  了解了WSGI框架,我们发现:其实一个WebAPP,就是一个WSGI的处理函数,针对每个HTTP请求进行响应。但是WSGI抽象程度还是比较低,我们可以使用Web框架来实现WebAPP。

  Python中的Web框架非常多,我们先直接选择一个比较流行的Web框架——Flask来使用。

  首先使用pip(Python包管理工具)来安装Flask:

sudo apt install python-pip #安装pip

pip install flask  #安装flask

  然后编写一个app.py,处理3个URL请求,分别是

  • GET / : 首页,返回Home页
  • GET /signin : 登陆页,显示登陆表单,用于用户登陆
  • POST /signin : 处理用户输入的登陆表单,返回登陆结果

  Flask通过Python的装饰器在内部自动地把URL和函数给关联起来,所以我们写出的代码应该这样:

from flask import Flask
from flask import request app = Flask(__name__) @app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>Home</h1>' @app.route('/signin', methods=['GET'])
def signin_form():
return '''<form action="/signin" method="post">
<p><input name="username" type="text"></p>
<p><input name="password" type="password"></p>
<p><input type="submit" value="Sign In"></p>
</form>
''' @app.route('/signin', methods=['POST'])
def signin():
if request.form['username'] =='admin' and request.form['password'] =='password':
return '<h3>Hello,admmin!</h3>'
return '<h3>Bad username or password!</h3>' if __name__ == '__main__':
app.run()

  运行python  app.py,Flask自带的server在端口5000上监听:

  打开浏览器,输入首页地址:http://localhost:5000/

  继续输入http://localhost:5000/signin:

  输入预设的用户名admin和密码password,登录成功:

  输入错误的信息:

  

  

Python Web开发的更多相关文章

  1. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  2. windows下python web开发环境的搭建

    windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.pyth ...

  3. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  4. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  5. 关于测试驱动的开发模式以及实战部分,建议看《Python Web开发测试驱动方法》这本书

    关于测试驱动的开发模式以及实战部分,建议看<Python Web开发测试驱动方法>这本书

  6. python web 开发学习路线

    转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...

  7. 转载:Python Web开发最难懂的WSGI协议,到底包含哪些内容?

    原文:PSC推出的第二篇文章-<Python Web开发最难懂的WSGI协议,到底包含哪些内容?>-2017.9.27 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有 ...

  8. python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

    1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message  4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表  6.运行 ...

  9. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  10. 2020 python web开发就业要求锦集

    郑州 Python程序员 河南三融云合信息技术有限公司 6-8k·12薪 7个工作日内反馈 郑州 1个月前 本科及以上2年以上语言不限年龄不限 微信扫码分享 收藏 Python程序员 河南三融云合信息 ...

随机推荐

  1. HDU 1018 Big Number (log函数求数的位数)

    Problem Description In many applications very large integers numbers are required. Some of these app ...

  2. [DevExpress]GridControl分页的实现

    加入两个组件:BindingNavigator和BindingSource 代码: using System; using System.Collections.Generic; using Syst ...

  3. javascript总结03

  4. SoapUI中的RegEx

    在for Content matching RegEx中

  5. 如何装载Storyboard中的ViewController?

      如上图所示,如何装载Storyboard中指定的ViewController? 首先,需要指定ViewController的ID,如上图右上方红色方框内的Storyboard ID.然后使用下面的 ...

  6. Codeforces Round #395 (Div. 1)

    比赛链接:http://codeforces.com/contest/763 A题: #include <iostream> #include <cstdio> #includ ...

  7. missing required source folder

    Eclipse 中XXX is missing required source folder 问题的解决 https://blog.csdn.net/itzhangdaopin/article/det ...

  8. 【WIP_S2】递归

    创建: 2018/01/14    递归  定义  自己召唤自己  通用形式  if (基本情况A的处理) {     ...     return 值A  } else if (基本情况B的处理) ...

  9. [C++ STL] deque使用详解

    一.deque介绍: deque(双端队列)是一个动态数组,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速. 在中间部分安插元素则比较费时,因为必须移动其它元素. 二.用法 1.头文件 #in ...

  10. magento “Model collection resource name is not defined” 错误

    问题出现于使用Grid时,解决方案.在使用的Model处添加 public function _construct() { parent::_construct(); $this->_init( ...