zoukankan      html  css  js  c++  java
  • 第十五章-Web开发

    随着web的发展, 最开始使用的CS架构已经不适合web了, 现在web使用的架构是BS架构

    如今大部分重量级的软件都以web形式提供了

    web开发的四个阶段

      1) 静态web页面

      2) CGI: 静态web页面是无法与用户交互的, 形成了CGI来处理用户动态发送的数据

      3) ASP/JSP/PHP: 使用脚本语言来结合HTML更加高效开发

      4) MVC: 解决脚本语言直接嵌入HTML导致维护差的问题, 使用MVC来简化web开发

    现在还出现了异步开发, MVVM等

    1 WSGI接口

      可以是用浏览器的开发者模式来查看HTTP的请求过程

      一个HTTP包含Header和Body两个部分, 其中Body是可选部分

      Header和Body是通过 来分割的

      Web的本质:

        1) 浏览器发送一个HTTP请求

        2) 服务器收到请求, 生成一个HTML文档

        3) 服务器吧HTML文档作为HTTP相应的Body发送给浏览器

        4) 浏览器收到HTTP相应, 从HTTP Body中取出HTML文档并显示

      因此简单的服务器的做法就是将HTML文件保存好, 接受用户的请求, 将对应的数据返回

      一般需要动态生成HTML文件的话, 就需要自己完成上述动作, 接受HTTP请求, 解析HTML, 再发送HTTP相应

      然而针对HTTP的处理并不是我们处理的关键, 因此有专门的服务器软件来帮助我们处理这些操作

      这个接口就是WSGI

      一般的WSGI接口的编写具体操作如下

      1) 导入库

    from wsgiref.simple_server import make_server
    

      2) 创建一个服务器并监听

    httpd = make_server('127.0.0.1', 8000, application)
    httpd.serve_forever()
    

      3) 实现相应函数

    def application(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [b'<h1>Hello, web!</h1>']
    

      固定传入两个参数

        environ: 包含所有HTTP请求信息的字典对象

        start_response: 发送HTTP响应的函数

        接受两个参数, 一个是HTTP响应码, 字符串类型; 一个是一个列表, 列表的元素是HTTP Header的键值对, 键值对用元组表示

      其中要注意Header只能发送一次, 且只能发送一次    

      通过return来返回body

    2 使用Web框架

      事实上, 写一个Web App就是编写一个以WSGI处理函数, 也是编写HTTP相应函数

      一般的, 处理不同的URL是通过environ变量中提取出HTTP请求的信息, 然后再逐个判断

      需要在此基础上进行进一步的封装, 常用的框架是Flask

      常用的Flask的用法

      1) 导入库

    from flask import Flask
    from flask import request
    

      2) 生成框架对象

    app = Flask(__name__)

      3) 响应URL

      使用装饰器来指定输入到该地址的处理函数, 具体写法如下

    @app.route('/', methods=['GET', 'POST'])
    def home():
        return '<h1>Home</h1>'
    
    @app.route('/signin', methods=['GET'])
    def signin_form():
        return '''<form action="/signin" method="post">
                  <p><input name="username"></p>
                  <p><input name="password" type="password"></p>
                  <p><button type="submit">Sign In</button></p>
                  </form>'''
    

      4) 启动框架

    app.run()
    

      通过框架, 我们就可以将我们的注意力集中到处理URL来, 这样免去对HTTP的处理

    3 使用模板

      使用框架解决了HTTP的处理, 但是还不是最简单的做法, 因为我们返回的页面是一个复杂的页面, 不能说在一个函数就直接返回页面的全部代码

      要记住: 不懂前端的Python工程师不是好的产品经理

      模板就是一个特殊的HTML文档, 里面使用前端+类似freemarker的语言

      进而形成了模型-视图-控制器的MVC设计模式

      M: 是用来传给V的, 这样在视图区域可以通过从模型中取出变量放到视图中

      V: 负责显示逻辑, 通过简单的替换一些变量, 最终形成用户看到的HTML

      C: 控制器, 负责业务逻辑

      具体实现如下

      1) 安装模板

    pip install jinja2
    

      2) 准备模板页面

    <html>
    <head>
      <title>Please Sign In</title>
    </head>
    <body>
      {% if message %}
      <p style="color:red">{{ message }}</p>
      {% endif %}
      <form action="/signin" method="post">
        <legend>Please sign in:</legend>
        <p><input name="username" placeholder="Username" value="{{ username }}"></p>
        <p><input name="password" placeholder="Password" type="password"></p>
        <p><button type="submit">Sign In</button></p>
      </form>
    </body>
    </html>
    

      3) 编写控制器

    @app.route('/signin', methods=['GET'])
    def signin_form():
        return render_template('form.html')
    
    @app.route('/signin', methods=['POST'])
    def signin():
        username = request.form['username']
        password = request.form['password']
        if username=='admin' and password=='password':
            return render_template('signin-ok.html', username=username)
        return render_template('form.html', message='Bad username or password', username=username)
    

      第一个方法用于处理展示页面给用户登录, 第二个方法是用于处理提交的表单

     

  • 相关阅读:
    爬虫之爬取淘宝主题市场主要产品信息
    Linux内核11-定时器和时间管理
    UNIX8-进程控制
    UNIX7-进程环境
    Unix3-文件I/O接口
    Linux进程-打开的文件
    递归与二叉树_leetcode230
    递归与二叉树_leetcode235
    递归与二叉树_leetcode226
    递归与二叉树_leetcode222
  • 原文地址:https://www.cnblogs.com/weihuchao/p/6963460.html
Copyright © 2011-2022 走看看