精华内容
参与话题
问答
  • web框架

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

    Web框架

    • Flask
    • Django
    • Tornado
    • Twisted
    • ODOO

    在这里插入图片描述

    展开全文
  • web服务器和web框架的作用及其关系

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

    web服务器和web框架的作用及其关系
    1.web服务器作用:
    1)解析请求报文,调用框架程序处理请求。
    2)组织响应报文,返回内容给客户端。
    2.web框架程序的作用:
    1)路由分发(根据url找到对应的处理函数) 。
    2)在处理函数中进行业务的处理。
    服务器和客户端之间的连接靠web服务器来维持,web服务器接收到请求后,将请求以及相关的参数传递给web框架,由框架负责生成内容,并将生成的内容传递给web服务器。所以web服务器的职责是接受并返回请求,web服务器的职责是内容生成服务器和客户端之间的连接靠web服务器来维持,web服务器接收到请求后,将请求以及相关的参数传递给web框架,由框架负责生成内容,并将生成的内容传递给web服务器。所以web服务器的职责是接受并返回请求,web服务器的职责是内容生成

    展开全文
  • [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()
    
    展开全文
  • 下面为大家简单的介绍一下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框架全面比较

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

    千次阅读 2019-01-17 10:02:31
    Web 服务器 当我们在浏览器输入URL后,浏览器会先请求DNS服务器,获得请求站点的 IP 地址。然后发送一个HTTP Request(请求)给拥有该 IP 的主机,接着就会接收到服务器给我们的 HTTP Response(响应),浏览器经过...
  • 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 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站!...
  • Java Web框架篇之Spring

    万次阅读 多人点赞 2019-06-04 17:41:31
    Web发展的几个阶段 (1)初级阶段:使用Model1(JSP+JavaBean)/Model2(Jsp+Servlet+JavaBean)/三层模型(表示层(JSP/Servlet)+业务逻辑层+持久化层)进行开发; (2)中级阶段:使用EJB进行分布式应用开发,忍受...
  • 最好的6个Go语言Web框架

    万次阅读 多人点赞 2017-12-07 14:26:37
    原文:Top 6 web ...以下为译文:GO 语言爱好者的最佳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...
  • nodejs 主流web框架对比

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

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

空空如也

1 2 3 4 5 ... 20
收藏数 135,738
精华内容 54,295
关键字:

web框架