Web开发基础
需要了解的基本知识
- 什么是 Web 框架,它可以干嘛?
- 为什么有 Web 框架?
- 基于 Python 的 Web 框架有哪些?
What is a Web Framework by Jeff Knupp
写得很好,对web和web框架的介绍非常清晰明了。
Web应用框架,简称Web框架,是编写web-enable应用的方法。无论是简单的博客还是复杂的Ajax应用,每一个网页都是通过代码写成的。
How The Web Works
在了解Web框架之前,要先了解web是怎么工作的。在浏览器输入了一个URL,点击"Enter",这过程究竟发生了什么?
web servers and ... web servers
网页以HTML
语言传送到浏览器(HTML
是浏览器用的语言,用来描述网页的内容和结构)。将HTML
发送到浏览器的应用叫做web server; 有一点容易引起混淆,应用所在的及其通常也被叫做web server.
归根结底,一个web application所做的只是将HTML
发送到浏览器。无论这个应用有多么复杂。
web application是怎么知道要发送什么内容的呢?浏览器要求啥它就发送啥
HTTP
浏览器将网站从web server(or "application server")那里下载下来,使用的是HTTP
协议(在编程语境下,协议指的是通信双方之间遵循的数据格式以及步骤)。HTTP
协议是基于request-reposne
模型。Client(浏览器)向web application 请求数据,web application 响应并返回浏览器请求的数据。
注意通信总是由client(浏览器)发起的 server无法发起连接冰箱浏览器主动发送数据。
HTTP方法
HTTP
协议中每个message都有其对应的方法。不同的HTTP
方法对应不同逻辑类型的客户端请求,反过来说意味着客户端要达到不同的目的。比如说,请求一个网页的HTML与提交表格,这两种不同的动作需要不同的方法。
HTTP GET
GET
方法词如其名:从web server拿数据。GET
毫无疑问是最常用的HTTP
请求。接到GET
请求,web application用做的仅仅是发送HTML. web application不能改变自身(比如GET
请求不能够生成新的用户账户).正因如此,通常认为GET
请求比较"安全"因为它们不能改变web application.
HTTP POST
出了看网页,有很多种与网站交互的方式。我们可以发送数据。POST
请求通常携带用户输入的数据,需要web server采取某些行动。比如在网站上注册,输入个人信息,是通过POST
来完成的。
与GET
不同,POST
请求会导致web server变动;此外,POST
请求不总是返回HTML页面到客户端。客户端通过响应代码response code来判断是否成功。
HTTP Response Codes
正常情况,web server返回200代码,意味着一切顺利。相应代码是3位数数字;每条响应,web server都要发送一个代码来说明这个请求的结果。200
最长用于GET
请求。POST
请求常见204
,意思是进行顺利但没什么可返回的。
需要注意POST
请求也是发送到特定的URL的,可能与数据提交所在的URL不同。
Web Applications
HTTP GET
和POST
是最常用的方法,能够做许多事情。web application的职责就是接收HTTP
请求,并作出HTTP
响应,一般是返回请求的HTML;POST
请求会需要web application做处行动,比如往数据库中添加一条记录。
Web Server Fatigue
随着web application复杂性增加,有一些需要解决的问题:
- 如何检查被请求的URL然后返回合适的网页?
- 怎么处理
POST
请求 - 怎么处理更复杂的概念,比如seesions, cookies
- 怎么增加application量级,处理上千的并发连接
显然,没人想要每一开发一款应用的时候都要解决这些问题。所以产生了一些专门处理
HTTP
协议中基础内容、能够解决上述问题的packages.但别忘了,它们的本质上是一样的,接受请求 - 做出HTTP
应答,并返回HTML.
注意客户段的web框架是个完全不同的概念
Solving The Big Two: Routing and Templates
制造web application有两个最大的问题:
- 怎么知道哪些代码是处理某个被请求的URL?
- 如果动态生成HTML - 即从数据库中提取数据,将计算后的值或信息插入HTML
不同的框架有不同的解决方式。以Django和Flask为例。
MVC in Django
首先要体协Django中的MVC模式。Django采用MVC模式并要求代码同样应用此模式。MVC, "Model-View-Controller"将应用的不同人物进行逻辑上的区分。数据表由models展示;controllers包括应用的业务逻辑,并对models进行操作;Views拿到数据信息,动态生成HTML。
Routing in Django
NOTE 暂缺 专注在Flask上
Routing in Flask
通过route()
decortor来实现
@app.route('/users/<id:int>')
def display_user(id):
# ...
decorator 采用简化的正则表达来进行URLs和arguments(将/
作为分隔符);通过<name:type>
directive URL中的argument(变量?)被传到route()
中; 镜头的URLs比如/info/about_us.html
是这样来处理的@app.route('/info/about_us.html')
HTML Generation Through Templates
HTML模版有点类似于str.format()
,动态的值先写着占位符,之后再根据str.format()
中的arguments(参数?)进行替换。可以这样理解,整个网页是一个长字符串,一些花括号中包含着变量,在字符串末尾调用str.format()
. Django和Flask用的模版都是用上述的方式。
模版不尽相同。Django对模版中代码的支持是比较基本的;而Jinja2几乎允许运行任意代码。Jinja2对模版生产的结果进行aggressive 缓存,所以后继如果参数一致的请求可直接从缓存中返回。
数据库交互 Database Interaction
Django 暂空 Flask没有相应的功能
Web框架总结
web框架的作用很明确:将处理HTTP
请求和响应的基础代码隐藏起来;隐藏的程度取决于不同的框架。Django和Flask代表了两个极端。Django对于每个场景都有相应的内容,甚至是过于详尽;Flask把自己定为一个“微框架”,仅处理极少的网络应用功能,靠第三方packages来处理一些不十分常见的web框架任务。
最后再重申一次,Python的web框架本质是一样的:接收HTTP
请求,调动相应的代码生成HTML,做出HTTP
响应和内容。实际上绝大多数的server-side框架原理都是如此(出了JS框架)。
Change logs
2017.02.10 Initial Draft