第十五章-Web开发
随着web的发展, 最开始使用的CS架构已经不适合web了, 现在web使用的架构是BS架构
如今大部分重量级的软件都以web形式提供了
web开发的四个阶段
1) 静态web页面
2) CGI: 静态web页面是无法与用户交互的, 形成了CGI来处理用户动态发送的数据
3) ASP/JSP/PHP: 使用脚本语言来结合HTML更加高效开发
4) MVC: 解决脚本语言直接嵌入HTML导致维护差的问题, 使用MVC来简化web开发
现在还出现了异步开发, MVVM等
1 WSGI接口
可以是用浏览器的开发者模式来查看HTTP的请求过程
一个HTTP包含Header和Body两个部分, 其中Body是可选部分
Header和Body是通过\r\n\r\n来分割的
Web的本质:
1) 浏览器发送一个HTTP请求
2) 服务器收到请求, 生成一个HTML文档
3) 服务器吧HTML文档作为HTTP相应的Body发送给浏览器
4) 浏览器收到HTTP相应, 从HTTP Body中取出HTML文档并显示
因此简单的服务器的做法就是将HTML文件保存好, 接受用户的请求, 将对应的数据返回
一般需要动态生成HTML文件的话, 就需要自己完成上述动作, 接受HTTP请求, 解析HTML, 再发送HTTP相应
然而针对HTTP的处理并不是我们处理的关键, 因此有专门的服务器软件来帮助我们处理这些操作
这个接口就是WSGI
一般的WSGI接口的编写具体操作如下
1) 导入库
from wsgiref.simple_server import make_server
2) 创建一个服务器并监听
httpd = make_server('127.0.0.1', 8000, application)
httpd.serve_forever()
3) 实现相应函数
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']
固定传入两个参数
environ: 包含所有HTTP请求信息的字典对象
start_response: 发送HTTP响应的函数
接受两个参数, 一个是HTTP响应码, 字符串类型; 一个是一个列表, 列表的元素是HTTP Header的键值对, 键值对用元组表示
其中要注意Header只能发送一次, 且只能发送一次
通过return来返回body
2 使用Web框架
事实上, 写一个Web App就是编写一个以WSGI处理函数, 也是编写HTTP相应函数
一般的, 处理不同的URL是通过environ变量中提取出HTTP请求的信息, 然后再逐个判断
需要在此基础上进行进一步的封装, 常用的框架是Flask
常用的Flask的用法
1) 导入库
from flask import Flask
from flask import request
2) 生成框架对象
app = Flask(__name__)
3) 响应URL
使用装饰器来指定输入到该地址的处理函数, 具体写法如下
@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"></p>
<p><input name="password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>'''
4) 启动框架
app.run()
通过框架, 我们就可以将我们的注意力集中到处理URL来, 这样免去对HTTP的处理
3 使用模板
使用框架解决了HTTP的处理, 但是还不是最简单的做法, 因为我们返回的页面是一个复杂的页面, 不能说在一个函数就直接返回页面的全部代码
要记住: 不懂前端的Python工程师不是好的产品经理
模板就是一个特殊的HTML文档, 里面使用前端+类似freemarker的语言
进而形成了模型-视图-控制器的MVC设计模式
M: 是用来传给V的, 这样在视图区域可以通过从模型中取出变量放到视图中
V: 负责显示逻辑, 通过简单的替换一些变量, 最终形成用户看到的HTML
C: 控制器, 负责业务逻辑
具体实现如下
1) 安装模板
pip install jinja2
2) 准备模板页面
<html>
<head>
<title>Please Sign In</title>
</head>
<body>
{% if message %}
<p style="color:red">{{ message }}</p>
{% endif %}
<form action="/signin" method="post">
<legend>Please sign in:</legend>
<p><input name="username" placeholder="Username" value="{{ username }}"></p>
<p><input name="password" placeholder="Password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>
</body>
</html>
3) 编写控制器
@app.route('/signin', methods=['GET'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['POST'])
def signin():
username = request.form['username']
password = request.form['password']
if username=='admin' and password=='password':
return render_template('signin-ok.html', username=username)
return render_template('form.html', message='Bad username or password', username=username)
第一个方法用于处理展示页面给用户登录, 第二个方法是用于处理提交的表单
第十五章-Web开发的更多相关文章
- [Vue 牛刀小试]:第十五章 - 传统开发模式下的 axios 使用入门
一.前言 在没有接触 React.Angular.Vue 这类 MVVM 的前端框架之前,无法抛弃 Jquery 的重要理由,除了优秀的前端 DOM 元素操作性以外,能够非常便捷的发起 http 请求 ...
- 进击的Python【第十五章】:Web前端基础之DOM
进击的Python[第十五章]:Web前端基础之DOM 简介:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示 ...
- Gradle 1.12用户指南翻译——第六十五章. Maven 发布(新)
其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://gith ...
- Gradle 1.12 翻译——第十五章. 任务详述
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12用户指南翻译——第二十五章. Scala 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- Gradle 1.12用户指南翻译——第三十五章. Sonar 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十五章:当后台线程遇到finally
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- Linux trace使用入门
概念 trace 顾名思义追踪信息,可通俗理解为一种高级打印机制,用于debug,实现追踪kernel中函数事件的框架.源代码位于:\kernel\trace\trace.c,有兴趣能够研究 撰写不易 ...
- myql5.7.7优化配置參数
# Other default tuning values # MySQL Server Instance Configuration File # ------------------------- ...
- HTML5 2D平台游戏开发#2跳跃与二段跳
在上一篇<Canvas制作时间与行为可控的sprite动画>中已经实现了角色的左右移动,本篇继续实现角色的一系列动作之一:跳跃.先来看看最终效果: 要实现跳跃,必须模拟垂直方向的速度和重力 ...
- python爬虫,从hao123爬取网址信息
最近研究python的爬虫,小小程序,拿下来分享,本人使用python3.7,纯粹兴趣爱好,希望能帮助大家激发兴趣.从hao123,爬取各种网址信息,代码如下. import urllib.reque ...
- 深入浅出Attribute (一)
正文: 什么是Attribute?Attribute是干什么使的?Attribute与Property到底有什么区别?…… 长久以来,这些问题一直困扰着并不怎么广大的C#初学者.原因大概有两个,一是A ...
- C#高级编程八十一天----捕获异常
捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描写叙述一下异常的捕获和处理. 案例代码: using System; using System.Co ...
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...
- antd引入普通html使用,将ant Design本地化
一直想着能本地化antd的,不用npm以及dva那么复杂的配置环境来开发,并且本地化以后对以后链接flask的模板渲染机制也能很好的结合.下面是具体的实现方法: 1.将react的相关链接引入: &l ...
- Spring IOC源代码具体解释之容器依赖注入
Spring IOC源代码具体解释之容器依赖注入 上一篇博客中介绍了IOC容器的初始化.通过源代码分析大致了解了IOC容器初始化的一些知识.先简单回想下上篇的内容 加载bean定义文件的过程.这个过程 ...
- tableView的cell显示不全的问题
如果是最上面的cell没有显示完整 1.重新设置tableview的frame: 例如你的搜索框高度为50,那么设置self.tableview.frame= CGRectMake(0,50,self ...