Python基础——PyCharm版本——第十章、Web开发

举报
红目香薰 发表于 2022/04/20 20:09:03 2022/04/20
【摘要】 ​ ​🤵🤗Python_Base:Chapter tenth🤗🤵目录前言Python网络框架示例:在一个Web应用中,客户端和服务器上的Flask程序的交互可以概括为以下几步:静态路由动态路由模板的使用Templat.html AddInfo.htmlDBHelper.pydemo.py​添加功能前言最早的软件都是运行在大型机上的,软件使用者通过“哑终端”登陆到大型机上去运行软件。后...

 

🤵🤗Python_Base:Chapter tenth🤗🤵

目录

前言

Python网络框架

示例:

在一个Web应用中,客户端和服务器上的Flask程序的交互可以概括为以下几步:

静态路由

动态路由

模板的使用

Templat.html 

AddInfo.html

DBHelper.py

demo.py

​添加功能


前言

最早的软件都是运行在大型机上的,软件使用者通过“哑终端”登陆到大型机上去运行软件。后来随着PC机的兴起,软件开始主要运行在桌面上,而数据库这样的软件运行在服务器端,这种Client/Server模式简称CS架构。

随着互联网的兴起,人们发现,CS架构不适合Web,最大的原因是Web应用程序的修改和升级非常迅速,而CS架构需要每个客户端逐个升级桌面App,因此,Browser/Server模式开始流行,简称BS架构。

在BS架构下,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。

当然,Web页面也具有极强的交互性。由于Web页面是用HTML编写的,而HTML具备超强的表现力,并且,服务器端升级后,客户端无需任何部署就可以使用到新的版本,因此,BS架构迅速流行起来。

今天,除了重量级的软件如Office,Photoshop等,大部分软件都以Web形式提供。比如,新浪提供的新闻、博客、微博等服务,均是Web应用。

Web应用开发可以说是目前软件开发中最重要的部分。Web开发也经历了好几个阶段:

  1. 静态Web页面:由文本编辑器直接编辑并生成静态的HTML页面,如果要修改Web页面的内容,就需要再次编辑HTML源文件,早期的互联网Web页面就是静态的;

  2. CGI:由于静态Web页面无法与用户交互,比如用户填写了一个注册表单,静态Web页面就无法处理。要处理用户发送的动态数据,出现了Common Gateway Interface,简称CGI,用C/C++编写。

  3. ASP/JSP/PHP:由于Web应用特点是修改频繁,用C/C++这样的低级语言非常不适合Web开发,而脚本语言由于开发效率高,与HTML结合紧密,因此,迅速取代了CGI模式。ASP是微软推出的用VBScript脚本编程的Web开发技术,而JSP用Java来编写脚本,PHP本身则是开源的脚本语言。

  4. MVC:为了解决直接用脚本语言嵌入HTML导致的可维护性差的问题,Web应用也引入了Model-View-Controller的模式,来简化Web开发。ASP发展为ASP.Net,JSP和PHP也有一大堆MVC框架。

目前,Web开发技术仍在快速发展中,异步开发、新的MVVM前端技术层出不穷。

Python的诞生历史比Web还要早,由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发。

Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。

本章我们会详细讨论Python Web开发技术。

Python网络框架

Django

Django于2003年诞生于美国堪萨斯(Kansas)州,最初用来制作在线新闻Web站点,目前已发展为应用最广泛的Python网络框架。

Django是遵循MVC架构的Web开发框架,其主要由以下几部分组成:

  • 管理工具(Management)
  • 模型(Model)
  • 视图(View)
  • 表单(Form)
  • 管理站(Admin)

Tornado

Tornado是使用Python编写的一个强大的可扩展的Web服务器。

相对于其他Python网络框架,Tornado有如下特点:

  • 完备的Web框架
  • 高效的网络库
  • 提供高效HTTPClient
  • 提供高效的内部HTTP服务器
  • 完备的WebSocket支持

Flask

Flask是目前最流行的开源的Python Web框架之一,其受欢迎程度不输于Django。

Flask是一个轻量级的可定制框架,拥有强大的插件库,较其他同类型框架更为灵活、轻便、安全且容易上手。

Flask的特点可以归结如下:

  • 内置开发服务器和调试器
  • 与Python单元测试功能无缝衔接
  • 使用Jinja2模板
  • 完全兼容WSGI 1.0标准
  • 基于Unicode编码

咱们这里主要使用的是【Flask】框架,下图是下载方法,也可以使用【pip install Flask】下载 

示例:

from flask import Flask as h5

# # 创建一个app应用
app = h5(__name__)


# 注册装饰器,装饰器的作用:将路由映射到视图
@app.route('/')
def index():
    return '<h1>Hello Python World!</h1>'


app.run()

在一个Web应用中,客户端和服务器上的Flask程序的交互可以概括为以下几步:

  1. 用户在浏览器输入URL访问某个资源。
  2. Flask接收用户请求并分析请求的URL。
  3. 为这个URL找到对应的处理函数。
  4. 执行函数并生成响应,返回给浏览器。
  5. 浏览器接收并解析响应,将信息显示在页面中。

DBHelper.py:

import pymysql


class DBHelper():
    """DBHelper"""

    def NoQuery(self,sql):
        """DML语句"""
        conn = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               passwd='root',
                               db='test',
                               charset='utf8')
        cursor = conn.cursor()
        cursor.execute(sql)
        rows = cursor.execute(sql)
        cursor.close()
        return rows


    def Query(self, sql):
        """查DQL询语句"""
        conn = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               passwd='root',
                               db='test',
                               charset='utf8')
        cursor = conn.cursor()
        cursor.execute(sql)
        info = cursor.fetchall()
        cursor.close()
        return info

demo.py

from flask import Flask
from DBHelper import DBHelper  # 使用第六章的DBHelper

app = Flask(__name__)  # 创建程序实例


# 注册路由
@app.route('/')
def index():
    db = DBHelper()
    result = db.Query("select * from userinfo")
    backStr = ""
    for info in result:
        backStr += ('编号:' + str(info[0]) + ' 创建时间:' + str(info[1]))
        backStr += ('账号:' + str(info[2]) + ' 简介:' + str(info[3]))
        backStr += "<br>"
    return backStr


app.run()

静态路由

@app.route(url路径) 

def 视图函数():

    代码段
from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "<a href='/hello'>点击跳转</a>"


# 注册路由:参数与href属性相对应
@app.route("/hello")
def say_hello():
    return "<h1>hello flask!</h1>"


app.run()

动态路由

@app.route(url路径/<变量名>)
def 视图函数(变量名):
    代码段
from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "<a href='/hello/666'>点击跳转</a>"


# 注册路由:参数与href属性相对应
@app.route("/hello/<userid>")
def search(userid):
    return "<h1>编号是:%s</h1>" % userid


app.run()

模板的使用

Templat.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板H5</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<a href="/AddInfo" class="btn btn-primary">添加</a>
<table class="table table-hover table-bordered" style="text-align:center">
        <tr class="info">
            <th>编号</th>
            <th>创建时间</th>
            <th>用户名</th>
            <th>简介</th>
        </tr>
        {% for row in showList %}
        <tr>
	        <td>{{ row[0] }}</td>
            <td>{{ row[1] }}</td>
            <td>{{ row[2] }}</td>
            <td>{{ row[3] }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

AddInfo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
    <form action="/SubmitAddInfo" method="post">
    <p>
        <input type="text" name="userName" placeholder="请输入用户名" class="form-control"/>
    </p>
    <p>
        <input type="text" name="introduce" placeholder="请输入用户简介" class="form-control"/>
    </p>
    <p>
        <input type="submit" value="添加" class="btn btn-primary"/>
    </p>
    </form>
</body>
</html>

DBHelper.py

import pymysql


class DBHelper():
    """DBHelper"""

    def NoQuery(self, sql):
        """DML语句"""
        conn = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               passwd='root',
                               db='test',
                               charset='utf8')
        cursor = conn.cursor()
        rows = cursor.execute(sql)
        conn.commit()
        cursor.close()
        conn.close()
        return rows

    def Query(self, sql):
        """查DQL询语句"""
        conn = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               passwd='root',
                               db='test',
                               charset='utf8')
        cursor = conn.cursor()
        cursor.execute(sql)
        info = cursor.fetchall()
        cursor.close()
        conn.close()
        return info

demo.py

from DBHelper import DBHelper  # 使用第六章的DBHelper
from flask import Flask, render_template, redirect
from flask import request
import time

app = Flask(__name__)


# 注册路由
@app.route('/')
def index():
    db = DBHelper()
    result = db.Query("select * from userinfo")
    print(result)
    return render_template("Template.html", showList=result)


@app.route('/AddInfo')
def AddInfo():
    return render_template("AddInfo.html")


def GetNow(localTime):
    """获取当前时间"""
    return time.strftime("%y-%m-%d %H:%M:%S", localTime)


# 注册路由
@app.route('/SubmitAddInfo', methods=["POST"])
def SubmitAddInfo():
    userName = request.form.get("userName")
    introduce = request.form.get("introduce")
    sql = str.format("insert into userinfo values(0,'{0}','{1}','{2}')", GetNow(time.localtime()), userName, introduce)
    db = DBHelper()
    db.NoQuery(sql)
    return redirect('/')


app.run()

运行效果:

添加俩数据看看:

添加功能

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。