精华内容
下载资源
问答
  • web框架

    千次阅读 2020-01-04 19:20:55
    Web框架 Flask Django Tornado Twisted ODOO

    Web框架

    • Flask
    • Django
    • Tornado
    • Twisted
    • ODOO

    在这里插入图片描述

    展开全文
  • 下面为大家简单的介绍一下Web框架的基本内容,希望对大家有帮助。 Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署...

    随着Web最新发展趋势的不断升级,Web项目开发也越来越难,而且需要花费更多的开发时间。所以,Web程序员灵活运用Web开发框架显得更为重要。下面为大家简单的介绍一下Web框架的基本内容,希望对大家有帮助。
    Web框架(Web framework)或者叫做Web应用框架(Web application framework),是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持支持的方法。使用Web框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。
    Web框架的功能
    Web框架使得在进行Web应用开发的时候,减少了工作量。Web框架主要用于动态网络开发,动态网络主要是指现在的主要的页面,可以实现数据的交互和业务功能的完善。使用Web框架进行Web开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。也就是说,通过对Web框架进行主观上的“缝缝补补”,就可以实现自己进行Web开发的需求了。
    以PHP为例,PHP可以在apache服务器上进行Web开发,而不必使用框架。使用PHP进行开的时候,在不适用框架的情况下,数据库连接就需要自己来实现,页面的生成和显示也是一样。比如框架的话可以完成避免sql注入的工作,而使用PHP在不用框架的情况下,这部分要自己做。

    目前Python主流的框架有Django和Flask等。Django是一个比较重量级的框架,重量级的意思是说,Django几乎所有的功能都帮助开发者写好了,有时候如果想做一个简单的网站,并不需要太多功能,这时候使用Django的话,就比较不合适,因为在部署网站的时候会导致很多不必要的功能也部署了进来。而Flask是一个轻量级的框架,一些核心的功能实现了,但是实现的功能并没有Django那么多,这样可以进行自己的发挥,在Flask的基础上,如果想实现更多的功能,可以很方便地加入。
    Java目前的主流开发框架是ssm(spring spring-mvc和mybatis)。相比之前的ssh(spring struts hibernate),ssm也是比较轻量级的框架。
    为了便于理解,个人创造了一个比方,如果将Web框架比作是旋律,歌词比作是业务逻辑,那么就是不同的歌曲。旋律可能有些地方不满足人的需求,可以进行修改。也可以在基础上增加新的旋律。或者是将框架比作素描的结果,然后在素描的基础上进行涂色,然后就可以成为一副画了。
    总结
    Web框架是用来进行Web应用开发的一个软件架构。主要用于动态网络开发。开发者在基于Web框架实现自己的业务逻辑。Web框架实现了很多功能,为实现业务逻辑提供了一套通用方法。
    在这里插入图片描述
    什么是Web框架、web框架有什么功能?
    有需要资料的可以加我:腾讯QQ3249838614
    或加入嵌入式就业交流群 551627734一起交流 学习 欢迎全国各地的大学生和各位行业大佬一起交流!
    (STM32串口应用)http://www.makeru.com.cn/live/detail/1290.html?s=69821
    (stm32电机驱动)http://www.makeru.com.cn/live/1392_1218.html?s=69821
    (定时器)http://www.makeru.com.cn/live/1392_1199.html?s=69821
    (DMA专题讲解)http://www.makeru.com.cn/live/1392_1020.html?s=69821]http://www.makeru.com.cn/live/1392_1048.html?s=69821http://www.makeru.com.cn/live/1392_1020.html?s=69821
    ( ADC读取光照传感器)http://www.makeru.com.cn/live/1392_1004.html?s=69821
    (STM32中断系统)http://www.makeru.com.cn/live/1392_1124.html?s=69821
    (时钟系统)http://www.makeru.com.cn/live/1392_1082.html?s=69821
    (stm32 实战之温湿度采集)http://www.makeru.com.cn/live/detail/1476.html?s=69821

    展开全文
  • 什么是web框架


      我们常用的web前端框架其实简单称呼叫web框架,现阶段web前端技术成熟,从视觉体验到用户体验都是比较好的,这也是从简单到复杂的web前端框架技术实现的,在国内前端技术开发人员也是非常的多,市面上的前端框架可以说是眼花缭乱,这里写这篇文章就是让你在使用不同的前端框架的时候能够明确的知道自己的选择。


    Web前端框架工作原理:

      在我们讨论框架之前,我们需要理解 Web 如何“工作”的。为此,我们将深入挖掘你在浏览器里输入一个 URL 按下 Enter 之后都发生了什么。在你的浏览器中打开一个新的标签,浏览http://www.uileader.com。我们讨论为了显示这个页面,浏览器都做了什么事情(不关心 DNS 查询)。

    Web 服务器

      每个页面都以 HTML 的形式传送到你的浏览器中,HTML 是一种浏览器用来描述页面内容和结构的语言。那些负责发送 HTML 到浏览器的应用称之为“Web 服务器”,会让你迷惑的是,这些应用运行的机器通常也叫做 web 服务器。

      然而,最重要的是要理解,到最后所有的 web 应用要做的事情就是发送 HTML 到浏览器。不管应用的逻辑多么复杂,最终的结果总是将 HTML 发送到浏览器(我故意将应用可以响应像 JSON 或者 CSS 等不同类型的数据忽略掉,因为在概念上是相同的)。

    HTTP

      浏览器从 web 服务器(或者叫应用服务器)上使用 HTTP 协议下载网站,HTTP 协议是基于一种 请求-响应(request-response)模型的。客户端(你的浏览器)从运行在物理机器上的 web 应用请求数据,web 应用反过来对你的浏览器请求进行响应。

      重要的一点是,要记住通信总是由客户端(你的浏览器)发起的,服务器(也就是 web 服务器)没有办法创建一个链接,发送没有经过请求的数据给你的浏览器。如果你从 web 服务器上接收到数据,一定是因为你的浏览器显示地发送了请求。

    HTTP Methods

      在 HTTP 协议中,每条报文都关联方法(method 或者 verb),不同的 HTTP 方法对应客户端可以发送的逻辑上不同类型的请求,反过来也代表了客户端的不同意图。例如,请求一个 web 页面的 HTML,与提交一个表单在逻辑上是不同的,所以这两种行为就需要使用不同的方法。

    HTTP GET

    GET 方法就像其听起来的那样,从 web 服务器上 get(请求)数据。GET 请求是到目前位置最常见的一种 HTTP 请求,在一次 GET 请求过程中,web 应用对请求页面的 HTML 进行响应之外,就不需要做任何事情了。特别的,web 应用在 GET 请求的结果中,不应该改变应用的状态(比如,不能基于 GET 请求创建一个新帐号)。正是因为这个原因,GET 请求通常认为是“安全”的,因为他们不会导致应用的改变。

    HTTP POST

      显然,除了简单的查看页面之外,应该还有更多与网站进行交互的操作。我们也能够向应用发送数据,例如通过表单。为了达到这样的目的,就需要一种不同类型的请求方法:POSTPOST 请求通常携带由用户输入的数据,web 应用收到之后会产生一些行为。通过在表单里输入你的信息登录一个网站,就是 POST 表单的数据给 web 应用的。

      不同于 GET 请求,POST 请求通常会导致应用状态的改变。在我们的例子中,当表单 POST 之后,一个新的账户被创建。不同于 GET 请求,POST 请求不总是生成一个新的 HTML 页面发送到客户端,而是客户端使用响应的响应码(response code)来决定对应用的操作是否成功。

    HTTTP Response Codes

      通常来说,web 服务器返回 200 的响应码,意思是,“我已经完成了你要求我做的事情,一切都正常”。响应码总是一个三位数字的代号,web 应用在每个响应的同时都发送一个这样的代号,表明给定的请求的结果。响应码 200 字面意思是“OK”,是响应一个 GET 请求大多情况下都使用的代号。然而对于 POST 请求, 可能会有 204(“No Content”)发送回来,意思是“一切都正常,但是我不准备向你显示任何东西”。

    Web 应用

      你可以仅仅使用 HTTP GET POST 做很多事情。一个应用程序负责去接收一个 HTTP 请求,同时给以 HTTP 响应,通常包含了请求页面的 HTMLPOST 请求会引起 web 应用做出一些行为,可能是往数据库中添加一条记录这样的。还有很多其它的 HTTP 方法,但是我们目前只关注 GET POST

      那么最简单的 web 应用是什么样的呢?我们可以写一个应用,让它一直监听 80 端口(著名的 HTTP 端口,几乎所有 HTTP 都发送到这个端口上)。一旦它接收到等待的客户端发送的请求连接,然后它就会回复一些简单的 HTML

      下面是程序的代码:

    import socketHOST = ''PORT = 80listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)listen_socket.bind((HOST, PORT))listen_socket.listen(1)connection, address = listen_socket.accept()request = connection.recv(1024)connection.sendall(b"""HTTP/1.1 200 OKContent-type: text/html

    <html>    <body>        <h1>Hello, World!</h1>    </body></html>""")connection.close()

      (如果上面的代码不工作,试着将 PORT 改为类似 8080 这样的端口。)

      这个代码接收简单的链接和简单的请求,不管请求的 URL 是什么,它都会响应 HTTP 200(所以,这不是一个真正意义上的 web 服务器)。Content-type:text/html 行代码的是 header 字段,header 用来提供请求或者响应的元信息。这样,我们就告诉了客户端接下来的数据是 HTML

    请求的剖析

      如果看一下测试上面程序的 HTTP 请求,你会发现它和 HTTP 响应非常类似。第一行<HTTP Method> <URL> <HTTP version>,在这个例子中是 GET / HTTP/1.0。第一行之后就是一些类似Accept: */* 这样的头(意思是我们希望在响应中接收任何内容)。

      我们响应和请求有着类似的第一行,格式是<HTTP version> <HTTP Status-code> <Status-code Reason Phrase>,在外面的例子中是HTTP/1.1 200 OK 。接下来是头部,与请求的头部有着相同的格式。最后是响应的实际包含的内容。注意,这会被解释为一个字符串或者二进制文件, Content-type 头告诉客户端怎样去解释响应。

      解决路由和模板两大问题

      围绕建立 web 应用的所有问题中,两个问题尤其突出:

    1.我们如何将请求的 URL 映射到处理它的代码上?

    2.我们怎样动态地构造请求的 HTML 返回给客户端,HTML 中带有计算得到的值或者从数据库中取出来的信息?

      每个 web 框架都以某种方法来解决这些问题,也有很多不同的解决方案。用例子来说明更容易理解,所以我将针对这些问题讨论 Django Flask 的解决方案。但是,首先我们还需要简单讨论一下 MVC

    Django 中的 MVC

    Django 充分利用 MVC 设计模式。 MVC,也就是 Model-View-Controller (模型-视图-控制器),是一种将应用的不同功能从逻辑上划分开。models 代表的是类似数据库表的资源(与 Python 中用 class 来对真实世界目标建模使用的方法大体相同)。controls 包括应用的业务逻辑,对 models 进行操作。为了动态生成代表页面的 HTML,需要 views 给出所有要动态生成页面的 HTML 的信息。

      在 Django 中有点让人困惑的是,controllers 被称做 views,而 views 被称为 templates。除了名字上的有点奇怪,Django 很好地实现了 MVC 的体系架构。

    Django 中的路由

      路由是处理请求 URL 到负责生成相关的 HTML 的代码之间映射的过程。在简单的情形下,所有的请求都是有相同的代码来处理(就像我们之前的例子那样)。变得稍微复杂一点,每个 URL 对应一个 view function 。举例来说,如果请求 www.foo.com/bar 这样的 URL,调用 handler_bar() 这样的函数来产生响应。我们可以建立这样的映射表,枚举出我们应用支持的所有 URL 与它们相关的函数。

      然而,当 URL 中包含有用的数据,例如资源的 ID(像这样 www.foo.com/users/3/) ,那么这种方法将变得非常臃肿。我们如何将 URL 映射到一个 view 函数,同时如何利用我们想显示 ID 3 的用户?

    Django 的答案是,将 URL 正则表达式映射到可以带参数的 view 函数。例如,我假设匹配^/users/(?P<id>\d+)/$ URL 调用 display_user(id) 这样的函数,这儿参数 id 是正则表达式中匹配的 id。这种方法,任何 /users/<some_number>/ 这样的 URL 都会映射到 display_user 函数。这些正则表达式可以非常复杂,包含关键字和参数。

    Flask 中的路由

    Flask 采取了一点不同的方法。将一个函数和请求的 URL 关联起来的标准方法是通过使用 route() 装饰器。下面是 Flask 代码,在功能上和上面正则表达式方法相同:

    @app.route('/users/<id:int>/')

    def display_user(id):

    # ...

      就像你看到的这样,装饰器使用几乎最简单的正则表达式的形式来将 URL 映射到参数。通过传递给route() URL 中包含的 <name:type> 指令,可以提取到参数。路由像 /info/about_us.html 这样的静态 URL,可以像你预想的这样 @app.route('/info/about_us.html') 处理。

    通过 Templates 产生 HTML

      继续上面的例子,一旦我们有合适的代码映射到正确的 URL,我们如何动态生成 HTML?对于 Django Flask,答案都是通过 HTML Templating

    HTML Templating 和使用 str.format() 类似:需要动态输出值的地方使用占位符填充,这些占位符后来通过 str.format() 函数用参数替换掉。想象一下,整个 web 页面就是一个字符串,用括号标明动态数据的位置,最后再调用 str.format() Django 模板和 Flask 使用的模板引擎 Jinja2 都使用的是这种方法。

      然而,不是所有的模板引擎都能相同的功能。Django 支持在模板里基本的编程,而 Jinja2 只能让你执行特定的代码(不是真正意义上的代码,但也差不多)。Jinja2 可以缓存渲染之后的模板,让接下来具有相同参数的请求可以直接从缓存中返回结果,而不是用再次花大力气渲染。

    数据库交互

    Django 有着“功能齐全”的设计哲学,其中包含了一个 ORM(Object Realational Mapper,对象关系映射)ORM 的目的有两方面:一是将 Python class 与数据库表建立映射,而是剥离出不同数据库引擎直接的差异。没人喜欢 ORM,因为在不同的域之间映射永远不完美,然而这还在承受范围之内。Django 是功能齐全的,而 Flask 是一个微框架,不包括 ORM,尽管它对 SQLAlchemy 兼容性非常好,SQLAlchemy Django ORM 的最大也是唯一的竞争对手。

      内嵌 ORM Django 有能力创建一个功能丰富的 CRUD 应用,从服务器端角度来看,CRUDCreateRead Update Delete)应用非常适合使用 web 框架技术。Django Flask-SQLchemy 可以直接对每个 model 进行不同的 CRUD 操作。

     总结:

      到现在为止,web前端框架的目的应该非常清晰了:向程序员隐藏了处理 HTTP 请求和响应相关的基础代码。至于隐藏多少这取决于不同的框架,Django Flask 走向了两个极端:Django 包括了每种情形,几乎成了它致命的一点;Flask 立足于“微框架”,仅仅实现 web 应用需要的最小功能,其它的不常用的 web 框架任务交由第三方库来完成。

      但是最后要记住的是,Python web 框架都以相同的方式工作的:它们接收 HTTP 请求,分派代码,产生 HTML,创建带有内容的 HTTP 响应。事实上,所有主流的服务器端框架都以这种方式工作的( JavaScript 框架除外)。但愿了解了这些框架的目的,你能够在不同的框架之间选择适合你应用的框架进行开发。

    展开全文
  • [33]python Web 框架:Tornado

    万次阅读 多人点赞 2018-06-10 00:08:59
    轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题 WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器 1.2.Tornado VS Djang...

    1.Tornado

    • Tornado:python编写的web服务器兼web应用框架

    1.1.Tornado的优势

    • 轻量级web框架
    • 异步非阻塞IO处理方式
    • 出色的抗负载能力
    • 优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题
    • WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器

    1.2.Tornado VS Django

    • Django:重量级web框架,功能大而全,注重高效开发
    • 内置管理后台
    • 内置封装完善的ORM操作
    • session功能
    • 后台管理
    • 缺陷:高耦合
    • Tornado:轻量级web框架,功能少而精,注重性能优越
    • HTTP服务器
    • 异步编程
    • WebSocket
    • 缺陷:入门门槛较高

    2.安装

    输入命令:

    pip install tornado
    

    备注:
    Tornado应该运行在类Unix平台,为了达到最佳的性能和扩展性,仅推荐Linux和BSD(充分利用Linux的epoll工具和BSD的kqueue达到高性能处理的目的)

    3.使用

    3.1.Tornado入门程序 - (一)

    #-*- coding:utf-8 -*-
    import tornado.web
    import tornado.ioloop
    
    
    #定义处理类型
    class IndexHandler(tornado.web.RequestHandler):
        #添加一个处理get请求方式的方法
        def get(self):
            #向响应中,添加数据
            self.write('好看的皮囊千篇一律,有趣的灵魂万里挑一。')
    
    if __name__ == '__main__':
        #创建一个应用对象
        app = tornado.web.Application([(r'/',IndexHandler)])
        #绑定一个监听端口
        app.listen(8888)
        #启动web程序,开始监听端口的连接
        tornado.ioloop.IOLoop.current().start()
    

    1 .在pycharm中直接运行代码
    2 .如果是在ubuntu,在命令窗口输入

    python 文件名.py
    

    使用浏览器访问

    4.Tornado 代码解析

    4.1.入门程序代码解析

    • tornado.web:tornado的基础web框架

      • RequestHandler:封装对请求处理的所有信息和处理方法
      • get/post/..:封装对应的请求方式
      • write():封装响应信息,写响应信息的一个方法
    • tornado.ioloop:核心io循环模块,封装linux的epoll和BSD的kqueue, tornado高性能处理的核心。

      • current()返回当前线程的IOLoop实例对象
      • start()启动IOLoop实力对象的IO循环,开启监听

    4.2.httpserver底层处理

    • httpserver监听端口
    tornado.httpserver.HTTPServer(app)
    httpserver.listen(port)
    
    • httpserver实现多进程操作
    tornado.httpserver.HTTPServer(app)
    httpserver.bind(port)
    httpserver.start(0/None/<0/num)
    
    # -*- coding:utf-8 -*-
    from tornado.web import Application,RequestHandler
    from tornado.ioloop import IOLoop
    from tornado.httpserver import HTTPServer
    
    class IndexHandler(RequestHandler):
        def get(self):
            self.write('给自己一点时间,理清所有的荒唐与期望。')
    
    if __name__ == '__main__':
        app = Application([(r'/',IndexHandler)])
        http_server = HTTPServer(app)
        #最原始的方式
        http_server.bind(8888)
        http_server.start(1)
    
        #启动Ioloop轮循监听
        IOLoop.current().start()
    

    同时打开两个窗口测试发现实现了多进程

    4.3.options配置

    • 全局配置
    tornado.options.define(
        name, default, type, multiple, help
    )
    
    • 命令行参数转换
    tornado.options.parse_command_line()
    
    #-*- coding:utf-8 -*-
    
    from tornado.web import RequestHandler,Application
    from tornado.ioloop import IOLoop
    from tornado.httpserver import HTTPServer
    import tornado.options
    
    #定义变量
    tornado.options.define('port',default=8000,type=int,help="this is the port >for application")
    
    class IndexHandler(RequestHandler):
       def get(self):
           self.write('我们既然改变不了规则,那就做到最好')
    
    if __name__ == '__main__':
       app = Application([(r'/',IndexHandler)])
       tornado.options.parse_command_line()
    
       http_server = HTTPServer(app)
       http_server.bind(tornado.options.options.port)
       http_server.start(1)
       #启动IOLoop轮循监听
       IOLoop.current().start()
    

    通过命令窗口输入port来访问
    通过使用我们命令窗口设定的port进行访问

    • 配置文件
    #即在当前py文件目录创建config文件,并在py代码中加入以下代码,
    tornado.options.parse_config_file("./config")
    
    • 配置模块:跟配置文件类似

    4.4.application配置

    • 程序调试之debug配置
    #自动重启+取消缓存模板+取消缓存静态文件+提供追踪信息
    tornado.web.Application([(..)], debug=True)
    
    注:开发之初可以设置debug=True方便调试,开发完毕改为False.
    
    • 路由信息初始化参数配置
    tonado.web.Application([(r””, Handler, {k:v})])
    def initialize(self, k)
    
    • 路由名称设置及反解析
    #名称设置
    tornado.web.Application([
        url(r””, handler, {k,v}, name=“”)
    ])
    
    #反解析操作
    reverse_url(name)
    

    实例

    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler, url
    from tornado.ioloop import IOLoop
    from tornado.httpserver import HTTPServer
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            self.write("<a href='"+self.reverse_url("login")+"'>用户登录</a>")
    
    
    class RegistHandler(RequestHandler):
        def initialize(self, title):
            self.title = title
    
        def get(self):
            self.write("注册业务处理:" + str(self.title))
    
    
    class LoginHandler(RequestHandler):
        def get(self):
            self.write("用户登录页面展示")
    
        def post(self):
            self.write("用户登录功能处理")
    
    
    if __name__ == "__main__":
        app = Application(
            [
                (r"/", IndexHandler),
                (r"/regist", RegistHandler, {"title": "会员注册"}),
                url(r"/login", LoginHandler, name="login"),
            ]
        )
    
        http_server = HTTPServer(app)
        http_server.listen(8000)
    
        IOLoop.current().start()
    

    4.5.参数传递

    • get方式传递参数
    get_query_arguments(name,default=_ARG_DEFAULT,strip=True)
    get_query_argument(name ,strip=True)
    
    • post方式传递参数
    get_body_arguments(name, default=_ARG_DEFAULT,strip=True)
    get_body_argument(name ,strip=True)
    

    实例

    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    from tornado.httpserver import HTTPServer
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            # 获取get方式传递的参数
            username = self.get_query_argument("username")
            usernames = self.get_query_arguments("username")
    
            print (username)
            print (usernames)
    
        def post(self):
            # 获取post方式传递的参数
            username = self.get_body_argument("username")
            usernames = self.get_body_arguments("username")
    
            print (username)
            print (usernames)
    
    if __name__ == "__main__":
        app = Application([(r"/",IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    
    #网页运行时需要传入参数
    #192.168.11.79:8000/?username=123
    
    • 混合方式
    get_arguments(..)/get_argument(..)
    

    实例

    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            # 获取get方式的参数
            user = self.get_argument("user")
            print("get方式获取参数:" + str(user))
    
        def post(self):
            # 获取post方式的参数
            user = self.get_argument("user")
            print("post方式获取参数:" + user.encode("utf-8"))
    
    
    if __name__ == "__main__":
        app = Application([(r"/", IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    
    • 其他参数
    通过request获取参数数据
    method/host/uri/path/query/version/headers/body/remote_ip/files
    

    实例

    • request/json
    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    
    
    class IndexHandler(RequestHandler):
        def get(self):
            print self.request
    
            json_str = {"username": "admin", "password": "123123"}
            self.write(json.dumps(json_str))
    
    
    
    if __name__ == "__main__":
        app = Application([(r"/", IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    
    • header
    • .add_header() .set_header() .set_default_headers()
      • 设置响应HTTP头, 前两者的不同点在于多次设置同一个项时, .add_header()叠加参数, 而.set_header()则以最后一次为准.
      • .set_default_headers()比较特殊, 是一个空方法, 可根据需要重写, 作用是在每次请求初始化RequestHandler时设置默认headers.
    • .clear_header() .clear()
      • .clear_header()清除指定的headers, 而.clear()清除.set_default_headers()以外所有的headers设置.
    # add_header
    self.add_header('Foo', 'one')
    self.add_header('Foo', 'two')
    # set_header
    self.set_header('Bar', 'one')
    self.set_header('Bar', 'two')
    
    # HTTP头的设置结果
    # Foo → one, two
    # Bar → two
    
    

    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    
    
    class IndexHandler(RequestHandler):
        def set_default_headers(self):
            # 第二种响应头设置方式
            print("---------> 响应头set_default_headers()执行")
            self.set_header("Content-type", "application/json; charset=utf-8")
            self.set_header("qiku", "奇酷信息")
    
        def get(self):
            # 第一种操作响应头的方式:
            # self.set_header("Content-type", "application/json")
            print("---------->get方法执行")
            self.write("{'name':'jerry'}")
            self.set_header("qiku", "qikuedu.com")
    
    
    if __name__ == "__main__":
        app = Application([(r"/", IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    
    • writerror
      • .send_error()用于发送HTTP错误页(状态码). 该操作会调用.clear() .set_status()
      • .write_error()用于清除headers, 设置状态码, 发送错误页. 重写.write_error()可以自定义错误页.
    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            self.write("hello qikuedu.com")
    
            self.send_error(404, msg="页面丢失", info="家里服务器搞对象去了")
    
        def write_error(self, status_code, **kwargs):
            self.write("<h1>出错啦,工程师MM正在赶来的途中...</h1>")
            self.write("<p>错误信息:%s</p>" % kwargs["msg"])
            self.write("<p>错误描述:%s</p>" % kwargs["info"])
    
    
    if __name__ == "__main__":
        app = Application([(r"/", IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    

    数据流

    • .write()

      • 将数据写入输出缓冲区. 如果直接传入dict, 那Tornado会自动将其识别为json, 并把Content-Type设置为application/json, 如果你不想要这个Content-Type, 那么在.write()之后, 调用.set_header()重新设置就好了. 需要注意的是, 如果直接传入的是list, 考虑到安全问题(json数组会被认为是一段可执行的JavaScript脚本, 且<script src="*/secret.json">可以绕过跨站限制),list将不会被转换成json.
    • .flush()

      • 将输出缓冲区的数据写入socket. 如果设置了callback, 会在完成数据写入后回调. 需要注意的是, 同一时间只能有一个"等待"的flush callback, 如果"上一次"的flush callback还没执行, 又来了新的flush, 那么"上一次"的flush callback会被忽略掉.
    • .finish()

      • 完成响应, 结束本次请求. 通常情况下, 请求会在return时自动调用.finish(), 只有在使用了异步装饰器@asynchronous或其他将._auto_finish设置为False的操作, 才需要手动调用.finish().
    • cookie

    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler
    from tornado.ioloop import IOLoop
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            self.write("hello qikuedu.com")
    
            self.set_cookie("loginuser", "admin老王")
    
            print self.get_cookie("loginuser")
    
            print self.cookies
    
    
    if __name__ == "__main__":
        app = Application([(r"/", IndexHandler)])
    
        app.listen(8000)
    
        IOLoop.current().start()
    

    页面

    • .render()

      • 返回渲染完成的html. 调用后不能再进行输出操作.
    • .redirect()

      • 重定向, 可以指定3xx重定向状态码. 调用后不能再进行输出操作.
    # 临时重定向 301
    self.redirect('/foo')
    # 永久重定向 302
    self.redirect('/foo', permanent=True)
    # 指定状态码, 会忽略参数 permanent
    self.redirect('/foo', status=304)
    
    • redirect
    # -*- coding:utf-8 -*-
    
    from tornado.web import Application, RequestHandler, url
    from tornado.ioloop import IOLoop
    from tornado.httpserver import HTTPServer
    
    
    class IndexHandler(RequestHandler):
    
        def get(self):
            self.write("<a href='"+self.reverse_url("login")+"'>用户登录</a>")
    
    
    class RegistHandler(RequestHandler):
        def initialize(self, title):
            self.title = title
    
        def get(self):
            self.write("注册业务处理:" + str(self.title))
    
    
    class LoginHandler(RequestHandler):
        def get(self):
            self.write("用户登录页面展示")
    
        def post(self):
            self.write("用户登录功能处理")
    
    
    if __name__ == "__main__":
        app = Application(
            [
                (r"/", IndexHandler),
                (r"/regist", RegistHandler, {"title": "会员注册"}),
                url(r"/login", LoginHandler, name="login"),
            ]
        )
    
        http_server = HTTPServer(app)
        http_server.listen(8000)
    
        IOLoop.current().start()
    
    展开全文
  • C++开发web服务框架之HTTP Web框架的设计与实现 基于vs2015与boost的程序
  • 最好的6个Go语言Web框架

    万次阅读 多人点赞 2017-12-07 14:26:37
    原文:Top 6 web ...以下为译文:GO 语言爱好者的最佳Web框架如果你是自己写一个小应用程序,那你可能不需要Web框架。但是如果你要做产品,那么你肯定需要一个好的框架。如果你认为你有相应的知识和经验,你会
  • web框架本质

    千次阅读 2016-12-08 00:27:52
    一、Web框架本质所有的web框架、web请求,本质上都是:socket。HTTP中,浏览器充当socket客户端,一次请求、一次响应,服务就断开了。import socketdef handle_request(client): buf = client.recv(1024) client....
  • zk入门.web框架

    2011-08-19 00:56:48
    zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架
  • web框架的本质及其分类

    千次阅读 2020-01-02 15:49:11
    初识web框架1. web框架本质2. HTTP协议3. 完善自定义的web框架4. 服务器程序和应用程序5. python中主流web框架分类...
  • web服务器和web框架的作用及其关系

    千次阅读 多人点赞 2018-10-15 21:24:27
    web服务器和web框架的作用及其关系 1.web服务器作用: 1)解析请求报文,调用框架程序处理请求。 2)组织响应报文,返回内容给客户端。 2.web框架程序的作用: 1)路由分发(根据url找到对应的处理函数) 。 2)在处理...
  • go web框架选择

    千次阅读 2018-09-11 10:24:11
    现在给大家分享下github上在go的相关排名前十web框架的相关信息: (上述图片信息来源于github的项目,也可以了解更多框架,地址:https://github.com/mingrammer/go-web-framework-stars)  俗话说适合自己的...
  • Flask(python web框架)安全

    万次阅读 2021-03-04 15:34:45
    Flask 作为一个 WEB 框架来说内部封装的安全性的措施很多,基本解决了常见的 web 漏洞,下面介绍 Flask 是如何来避免产生 常见的 web 漏洞。 SQL注入: Flask 使用 ORM 对象关系映射的数据库管理方式,同时 Flask ...
  • Scala的四种Web框架

    千次阅读 2017-08-14 09:09:52
    Finatra Finatra是基于 Twitter-server platform平台, 运行在Finagle之上, 它是一个完整的异步框架。   Play Framework ...Play框架是一个Java 和 Scala的产品化Web应用框架,...Scalatra 是特别小巧的Web框架,也
  • go之web框架 iris

    万次阅读 2018-06-08 17:37:34
    最近开始学习GO的WEB框架,IRIS号称是Go最快的后端Web框架,目前发展最快的Go Web框架。提供完整的MVC功能并且面向未来。 所以先从它开始。 github地址 https://github.com/kataras/iris 文档 ...
  • 异步Web框架全面比较

    千次阅读 2019-04-11 09:38:39
    Node.js是开发web后端的最佳选择。它用于构建快速,可伸缩的服务器端Web应用程序。...目前最强的web后端框架仍然是Express,但是我很担心以后express会变成所谓的“经典的框架‘或者”传统web框架“,因为一旦...
  • Go语言web框架 gin

    千次阅读 2016-11-08 13:43:59
    Go语言web框架 gin
  • 什么是web框架

    千次阅读 2017-09-11 14:37:44
    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式。从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的。我发现很多人都热衷于学习 web 框架技术,例如 Flask ...
  • 2015年Web框架评测

    千次阅读 2015-04-29 13:13:18
    2015年Web框架评测国外的TechEmpower公司今年再次发布了2015年Web框架评测报告。2014年的报告见:http://www.infoq.com/news/2014/05/benchmark-web-framework,2013年的报告见:...
  • Python进阶(三十六)-Web框架Django项目搭建全过程

    万次阅读 多人点赞 2017-04-15 08:53:16
    Python Web框架Django项目搭建全过程   IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5   Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站!...
  • 快速开发一个 Web 框架

    千次阅读 2018-07-28 23:30:01
    怎么使用 Node.js 开发一个属于自己的 Web 框架呢?下面我将带领大家在 Koa2 的基础上开发一款初步具备 Web 功能的框架。 本场 Chat 主要内容: Web 框架需要那些功能。 完成一个简单的框架雏形。 添砖加瓦,构成一...
  • nodejs 主流web框架对比

    千次阅读 2020-06-03 10:56:35
    Node.js主流Web框架对比。由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。另外由于消费电子产品所采用的嵌入式处理器芯片的...
  • python四大主流web框架

    千次阅读 2020-11-07 09:12:25
    python四大主流web框架 转载自博客:https://www.cnblogs.com/an-wen/p/11330834.html --爱文飞翔 Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在...
  • 什么是 web 框架

    千次阅读 2018-04-22 11:46:42
    Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式。从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的。我发现很多人都热衷于学习 web 框架技术,例如 Flask ...
  • Web框架和前端框架以及Ajax的常用框架易混淆(混为一谈)  首先,要清楚web框架和前端框架的以及Ajax的常用框架区别!之前我认为人家说的框架就是一个项目的框架模式,是否是嵌套宽假模式、还是悬浮框架模式、...
  • 《架构探险——从零开始写Java Web框架》首先从一个简单的 Web 应用开始,让读者学会如何使用IDEA、Maven、Git等开发工具搭建 Java Web 应用;接着通过一个简单的应用场景,为该 Web 应用添加若干业务功能,从需求...
  • 浅谈五大Python Web框架

    千次阅读 2019-09-03 19:53:55
    浅谈五大Python Web框架 转载:http://feilong.me/2011/01/talk-about-Python-web-framework 说到Web Framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework、framework...
  • 简单而直接的Python web 框架web.py

    万次阅读 多人点赞 2016-11-03 14:09:08
    web.py 是一个Python 的web 框架,它简单而且功能强大。web.py 是公开的,无论用于什么用途都是没有限制的。而且相当的小巧,应当归属于轻量级的web 框架。但这并不影响web.py 的强大,而且使用起来很简单、很直接。...
  • python web框架 - Django

    千次阅读 2014-03-23 16:30:13
    Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。Django遵守BSD版权,初次发布于2005年7月, 并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,019,150
精华内容 407,660
关键字:

web框架