web框架前戏---web框架的本质

Web框架本质

众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

#!/usr/bin/env python
#coding:utf-8

import socket

def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")
    client.send("Hello, Seven")

def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((‘localhost‘,8000))
    sock.listen(5)

    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

if __name__ == ‘__main__‘:
    main()

上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

python标准库提供的独立WSGI服务器称为wsgiref。

from wsgiref.simple_server import make_server

def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    return [bytes(‘<h1>Hello, web!</h1>‘, encoding=‘utf-8‘), ]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

自定义Web框架

一、框架

通过python标准库提供的wsgiref模块开发一个自己的Web框架

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server

def index():
    return ‘index‘

def login():
    return ‘login‘

def routers():

    urlpatterns = (
        (‘/index/‘,index),
        (‘/login/‘,login),
    )

    return urlpatterns

def RunServer(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    url = environ[‘PATH_INFO‘]
    urlpatterns = routers()
    func = None
    for item in urlpatterns:
        if item[0] == url:
            func = item[1]
            break
    if func:
        return func()
    else:
        return ‘404 not found‘

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

2、模板引擎

在上一步骤中,对于所有的login、index均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符合HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>Index</h1>

</body>
</html>

index.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form>
        <input type="text" />
        <input type="text" />
        <input type="submit" />
    </form>
</body>
</html>

login.html

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from wsgiref.simple_server import make_server

def index():
    # return ‘index‘
    f = open(‘index.html‘)
    data = f.read()
    return data

def login():
    # return ‘login‘
    f = open(‘login.html‘)
    data = f.read()
    return data

def routers():

    urlpatterns = (
        (‘/index/‘, index),
        (‘/login/‘, login),
    )

    return urlpatterns

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    url = environ[‘PATH_INFO‘]
    urlpatterns = routers()
    func = None
    for item in urlpatterns:
        if item[0] == url:
            func = item[1]
            break
    if func:
        return func()
    else:
        return ‘404 not found‘

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, run_server)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

对于上述代码,虽然可以返回给用户HTML的内容以现实复杂的页面,但是还是存在问题:如何给用户返回动态内容?

  • 自定义一套特殊的语法,进行替换
  • 使用开源工具jinja2,遵循其指定语法

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{name}}</h1>

    <ul>
        {% for item in user_list %}
        <li>{{item}}</li>
        {% endfor %}
    </ul>

</body>
</html>

index.html

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from wsgiref.simple_server import make_server
from jinja2 import Template

def index():
    # return ‘index‘

    # template = Template(‘Hello {{ name }}!‘)
    # result = template.render(name=‘John Doe‘)

    f = open(‘index.html‘)
    result = f.read()
    template = Template(result)
    data = template.render(name=‘John Doe‘, user_list=[‘alex‘, ‘eric‘])
    return data.encode(‘utf-8‘)

def login():
    # return ‘login‘
    f = open(‘login.html‘)
    data = f.read()
    return data

def routers():

    urlpatterns = (
        (‘/index/‘, index),
        (‘/login/‘, login),
    )

    return urlpatterns

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    url = environ[‘PATH_INFO‘]
    urlpatterns = routers()
    func = None
    for item in urlpatterns:
        if item[0] == url:
            func = item[1]
            break
    if func:
        return func()
    else:
        return ‘404 not found‘

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, run_server)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

遵循jinja2的语法规则,其内部会对指定的语法进行相应的替换,从而达到动态的返回内容,对于模板引擎的本质,参考另外一篇博客:http://www.cnblogs.com/wupeiqi/p/4592637.html

时间: 2025-01-09 01:06:14

web框架前戏---web框架的本质的相关文章

Python3 之 Web 框架:web框架的本质

各位,学Python 的同志,相信对 Django .Flask.等不会陌生,这些就是Python语言的web 框架. 那么问题来了,web 服务器又是什么,他和web框架有什么关系?他们又是如何工作的,分别处于什么位置?还有有时候有人会把HTTP服务器叫做web服务器,这是为何?这种说法对吗?带着这些疑问,听我慢慢道来- 一.什么是 Web 服务器 平时我们都是通过浏览器(比如Chrome,Firefox等)上网的,当我们在浏览器的地址栏里输入地址后,会得到一个网页. 这个网页就是 web 服

从零开始搭建论坛(一):Web服务器与Web框架

之前用 Django 做过一个小的站点,感觉Django太过笨重,于是就准备换一个比较轻量级的 Web 框架来玩玩.Web.py 作者已经挂掉,项目好久没有更新,所以不准备用它.而 Flask 也是一个成熟的轻量级 Web 框架,在 github 上有众多的 Star 和 Fork,文档和扩展也很丰富,值得学习. 学习一个框架最好的方式就是用框架做一个项目,在实战中理解掌握框架.这里我用 Flask 框架,使用 Mysql 数据库做了一个论坛系统.麻雀虽小,五脏俱全,论坛效果图如下: 下面是论坛

Java的web开发用什么框架好

在做Java的web开发时,不同的公司,不同的程序员可能都会采用不同的框架,使用不同的框架有什么区别,又有哪些好处呢?今天武汉java培训专家带大家和大咖一起来学习一下其中的要领:今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做Java的web开发,会选择struts2或者springMVC这样的框架,而不是

基于Spring框架的Web应用开发笔记 - incomplete

Motivation 最近的工作涉及Web框架搭建,在了解公司原有采用框架基础上对Web开发技术栈做了一次升级,在次做记录. Audience J2EE Web Application Developer, Spring user, Scope 快速应用开发.Web层+安全.持久层 Progress 2015/6/14 init Outline 1 用Spring Boot快速开发应用 2 Spring的Web框架和Security横切面 3 Spring Data:通用数据持久化解决方案 Co

二十二、【轻量级开源框架】EFW框架Web前端开发之JqueryEasyUI

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu.com/s/1o6MAKCa 前言:EFW框架主要用于行业软件软件开发,所以软件的界面需要体现专业.漂亮.风格统一的效果:在Web方便这种界面框架还是有不少,如强大的EXT,基于Jquery的JqueryUI,还有一些国产的也都比较漂亮:而EFW框架中推荐的是JqueryEasyUI,为什么选择

二十一、【.Net开源框架】EFW框架Web前端开发之目录结构和使用FireBug调试方法

回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu.com/s/1o6MAKCa 前言:前面多章对EFW框架的核心类库作了详细说明,接下来几章将对框架中的前端及界面层功能进一步讲解,前端分为两个部分Web前端和Winform前端,Web前端主要是在Web系统中使用,就是编写Html代码和JS代码开发网页界面,框架推荐的是JqueryEasyUI作为界面框架:W

程序员Web面试之前端框架等知识

基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮子开始造汽车. 下面就Web开发用到的前端框架.UI套件.UI插件一一列举(排名不分先后): jQuery UI jQuery UI以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件.包含了许多维持状态的小部件(Widget)

Web应用框架在WEB工程中的作用

Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.它的出现是为了减轻网页开发时共通性活动的工作负荷并且可提升代码的可再用性.它是经过长期实践被大家认可的,正确,高效的代码. 常用的Web应用框架有MVC,CMS等.而这次我们团队所使用的Web应用框架就是MVC模式,这种模式的优点有很多例如耦合性低.重用性高.部署快.维护容易等详情参考百度百科http://baike.baidu.com/view/5432454.h

MyEclipse使用总结——在MyEclipse中新建Maven框架的web项目[转]

前面的文章我们已经在本机安装好了maven,同时在myeclipse中配置好了maven的插件. 链接如下: Maven安装----在Windows上安装Maven myeclipse安装maven插件 现在我们就开始在myeclipse中新建一个maven框架的web项目 新建项目 填写项目名称,一定记得勾选Add Maven support (java EE如果选取5.0报错,则选6.0) 我们的maven项目就新建好了,相关基本的依赖已经在pom.xml中.项目机构如下: 可能出现的错误及