zoukankan      html  css  js  c++  java
  • Web框架

    Web框架

    1. Bottle

      Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只有一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块。

      创建项目

      from bottle import template, Bottle
      
      root = Bottle()
      
      @root.route('/hello/')
      def index():
          return '<b>Hello World!</b>'
      
      root.run(host='localhost', port=8080, debug=True)
      

      详情请看转载链接:https://www.cnblogs.com/wupeiqi/articles/5341480.html

    2. flask

      Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

      “微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

      默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

      路由映射的方式
      获取用户请求相关的信息
      • request.method
      • request.args
      • request.form
      • request.values
      • request.files
      • request.cookies
      • request.headers
      • request.path
      • request.full_path
      • request.script_root
      • request.url
      • request.base_url
      • request.url_root
      • request.host_url
      • request.host
      Flask框架九大基础功能
      # 后端代码
      from flask import Flask, render_template, request, make_response, redirect, session
      # 1.静态文件和模板路径匹配
      app = Flask(__name__)
      
      
      # 5.自定制前端模板函数
      def text():
          return '<a href="#">链接</a>'
      
      
      @app.route('/', methods=['GET', 'POST'])
      def hello_world():
          # 7.获取请求内容,及请求方法
          print(request.args)
          # 3.返回字符串
          # return 'Hello World!'
          # 4.返回模板
          return render_template('index.html',
                                 k1='root',
                                 k2=[1, 2, 3],
                                 k3={'name': 'eric', 'pwd': '1234'},
                                 k4=text)
          # 8.响应额外的数据
          # resp = make_response(render_template('index.html',
          #                                      k1='root',
          #                                      k2=[1, 2, 3],
          #                                      k3={'name': 'eric', 'pwd': '1234'},
          #                                      k4=text))
          # resp.set_cookie('username', 'the name')
          # return resp
          # 9.重定向,类似于Django的reverse功能:url_for
          # return redirect('/hello/about')
          # url = url_for('hello', 'about')
          # return redirect(url)
          # 10.Session:你可以理解成我们用浏览器上网,到关闭浏览器的这一过程。session是会话过程中,服务器用来记录特定用户会话的信息。
      
      # 6.路由映射
      # -   @app.route('/user/<username>')
      # -   @app.route('/post/<int:post_id>')
      # -   @app.route('/post/<float:post_id>')
      # -   @app.route('/post/<path:path>')
      # -   @app.route('/login', methods=['GET', 'POST'])
      # 以hello为路径头后面接括号中的:about,help,imprint,class,"foo, bar"这几个参数发送请求
      @app.route('/hello/<any(about,help,imprint,class,"foo, bar"):page_name>')
      def hello(page_name):
          return page_name
      
      
      if __name__ == '__main__':
          # 2.IP和端口的配置:默认端口5000
          app.run()
      
      <!-- 前端代码块 -->
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h2>Hello world!</h2>
      {{ k1 }}
      {{ k2 }}
      <ul>
      {% for item in k2 %}
      <li>{{ item }}</li>
      {% endfor %}
      </ul>
      {{ k3 }}
      <ul>
      {% for key,value in k3.items() %}
      <li>{{ key }}:{{ value }}</li>
      {% endfor %}
      </ul>
      {{ k4() | safe }}
      </body>
      </html>
      
      自定制中间件

      类似于页面的错误提示可以用到这个中间件

      # Author:wylkjj
      # Date:2020/2/28
      # -*- coding:utf-8 -*-
      from flask import Flask
      app = Flask(__name__)
      
      
      @app.route('/index/', methods=['GET', 'POST'])
      def hello_world():
          print('...')
          return 'OK'
      
      
      def my_wsgi_app(environ, start_response):
          print('my_wsgi_app')
          start_response('200 OK', [('Content-Type', 'text/html')])
          return [bytes('<h1>Hello</h1>', encoding='utf-8'), ]
      
      
      class Foo:
          def __init__(self, w):
              self.w = w
      
          def __call__(self, environ, start_response):
              obj = self.w(environ, start_response)
              return obj
      
      
      if __name__ == '__main__':
          # app.wsgi_app = my_wsgi_app
          # 11.自定制中间件
          app.wsgi_app = Foo(app.wsgi_app)
          app.run()
      
      Message

      message是一个基于Session实现的用于保存数据的集合,其特点是:使用一次就删除

      from flask import Flask, flash, render_template, request,get_flashed_messages
      app = Flask(__name__)
      
      
      @app.route('/')
      def index1():
          # 12. 获取消息
          v = get_flashed_messages()
          print(v)
          return render_template('s4.html')
      
      
      @app.route('/set')
      def index2():
          v = request.args.get('p')
          # 13. 设置消息
          flash('kkkk')
          return 'ok'
      
      
      if __name__ == "__main__":
          app.run()
      
    3. tornado

      Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

      Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)

      基本流程

      第一步:执行脚本,监听 8888 端口

      第二步:浏览器客户端访问 /index --> http://127.0.0.1:8888/index

      第三步:服务器接受请求,并交由对应的类处理该请求

      第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

      第五步:方法返回值的字符串内容发送浏览器

      调用方法,框架的基本创建
      import tornado.ioloop
      import tornado.web
        
        
      class MainHandler(tornado.web.RequestHandler):
          def get(self):
              self.write("Hello, world")
        
      application = tornado.web.Application([
          (r"/index", MainHandler),
      ])
        
        
      if __name__ == "__main__":
          application.listen(8888)
          tornado.ioloop.IOLoop.instance().start()
      
    4. 模板语言:(Django和jinja2语言相似)

      • Django模板语言: ORM,模板语言
      • Jinja2: 模板引擎
      • bootle模板语言
    5. 三大组件

      • 路由系统
      • 控制器(含模板渲染)
      • 数据库操作
    6. 微型框架

      • 依赖第三方写的socket,遵循WSGI规范
      • 本身功能少
    7. 安装

      • pip install bottle
      • pip install flask
      • pip install tornado
    8. 路由映射大约可分为三种:

      • Django的路由映射是一种:path = [ '/index/' , view.index ]

      • bottle的路由映射也是一种:

        @route

        def func():

        ​ pass

      • 最厉害的第三种:

        url = ( [ ' /?Pw+/ /?Pw+' ] )

        / acount / login

        acount.py

        ​ login方法

    Web组件的定制

    1. Session
    2. Form组件
  • 相关阅读:
    微信小程序Tab选项卡切换大集合
    微信小程序基于swiper组件的tab切换
    微信小程序基于scroll-view实现锚点定位
    商家 APP 如何接入新版支付宝支付,老版本商家如何升级
    JSON 接口如何实现 RSA 非对称加密与签名
    基于微信小程序的用户列表点赞功能
    tensorflow中常用学习率更新策略
    交叉熵损失函数和均方误差损失函数
    python中几个实用的文件操作
    特征选择
  • 原文地址:https://www.cnblogs.com/wylshkjj/p/12377230.html
Copyright © 2011-2022 走看看