Python Web编程入门

127 篇文章 7 订阅
14 篇文章 4 订阅

Python  Web编程入门

web应用程序的工作原理简易示意如下图:

一般的,网站使用HTML语言来编写,放在Web服务器上,用户使用浏览器发送HTTP协议请求服务器上的Web页面,服务器上Web服务器将接收到的用户请求进行相应处理后进行相应处理,再将处理结果以HTML文件的形式发送给客户端浏览器,显示给用户。

HTTP协议在Web领域的重要性不必赘述,这样一个重要的概念,如果交给开发者去实现,且不谈编程,单是看懂庞大的协议,就会花掉大量的时间,幸好有一些,幸好有一些很成熟的库或框架库为我们减轻了大量机械重复的工作。

【HTTP简单地说就是浏览器和服务器聊天是的一种约定, 这个约定确保双方互相理解。其实完整的HTTP是非常复杂的,《HTTP权威指南》一书厚达700多页。

有关HTTP可参见 HTTP和HTTPS学习笔记_cnds123的专栏-CSDN博客

全面理解HTTP协议 http://www.52im.net/thread-1677-1-1.html

Web 开发可以粗略地定义为构建、创建和维护一个网站。

Web开发在近年来,随着本身技术的突破以及移动设备的普及,基于web领域的开发,也出现了明确的岗位职责分工,一个web互联网产品中,基本上会分为web UI设计、Web前端开发以及web后端开发。

Web应用开发通常分为前端(front-end)、后端(back-end)、全栈(full stack)开发,示意图如下:

Web前端开发

Web前端开发用到的编程语言主要有javascript,以及伴随有标记性文本语言html和样式渲染方式CSS。以及近年来衍生出来的一批优秀web前端框架,使web前端在应用构建方面的效率得到显著提升。

Web后端开发

Web后端开发,主要用到的语言有java、php、python等,当前nodeJs更多的是面向web前端开发人员,随着nodeJs的兴起发展,也成为近年来服务端开发的另一种选择。

Web全栈开发

Web全栈开发,从程序开发的角度来说,就是开发人员可以承担包括前端和后端在内的所有功能的开发任务。

关于这些更多情况,可参见 Web中一些术语的含义_cnds123的专栏-CSDN博客

Python为进行Web开发提供了WSGI(Web Server Gateway Interface, Web 服务器网关接口)。WSGI是 Web 服务器软件和用 Python 编写的 Web 应用程序之间的标准接口,具有标准接口能够让支持 WSGI 的应用程序与多种不同的 Web 服务器配合使用, WSGI为开发者封装了HTTP协议的实现,将网络通信抽象为接收数据报和发送数据报的简单方法/函数,关于Python的WSGI 可参考wsgiref --- WSGI 工具和参考实现 — Python 3.10.1 文档

WSGI提供的接口虽然比HTTP接口高级了不少,但和Web App的处理逻辑比,还是比较低级,在WSGI接口之上能进一步抽象,就有了Web框架。

Web编程,涉及的范围太广,本文主要简要介绍Python Web编程使用的目前较为主流Django 和 Flask框架。

什么是 Web 框架,为什么如此重要?可以把 Web 框架想象成一个工具箱。一个 Web 框架是预先写好的,由标准化的代码组成,为编写 Web 应用程序服务,目的是为了使开发更快、更容易,包装和模块的集合,使 web 应用程序更加可靠,更容易扩展。Web 框架用在后端(服务器端),如用在 URL 路由,HTTP 请求和响应,访问数据库以及 Web 安全。虽然不一定非要使用 Web 框架,但建议普通开发者使用它,因为它可以帮助你用更少的时间开发更复杂的应用程序。

Django框架

为了在更短的时间内创建复杂、高质量的 web 应用,很多 web 开发人员会首选 Django 框架。Django 提供了一个开放源代码的高级框架,它内置了许多模块,极大的方便了 Web 开发者,也正是由于它的“全面性”,增加学习入门难度。

Django采用了MVT的框架模式,即模型M,视图V和模版T,最早于2005年发布。Django被认为是"大而全"的重量级Web框架,其自带大量的常用工具和组件(比如数据库ORM组件、用户认证、权限管理、分页、缓存), 甚至还自带了管理后台Admin,适合快速开发功能完善的企业级网站。Django自带免费的数据SQLite,同时支持MySQL与PostgreSQL等多种数据库。

Django 官网:https://www.djangoproject.com/

Django中文文档Django 文档 | Django 文档 | Django

Django源码 https://github.com/cookiecutter/cookiecutter-django

Flask框架

Flask 被认为是一个微框架,是一个简约的 Web 框架。它不那么“包含电池”,这意味着它缺少像 Django 这样的全栈框架提供的许多特性和功能,例如 Web 模板引擎,帐户授权和身份验证。

Flask是一个由Python语言写成的轻量级Web框架,最早由奥地利人Armin Ronacher于2010年发布。Flask最显著的特点是它是一个“微”框架(micro-framework),轻便灵活,但同时又易于扩展(Extensions)。默认情况下,Flask 只相当于一个内核,不包含数据库抽象层(ORM)、用户认证、表单验证、发送邮件等其它Web框架经常包含的功能。Flask依赖用各种灵活的扩展(比如邮件Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy)来给Web应用添加额外功能。Flask的这种按需扩展的灵活性也是缺点你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。

Flask文档Welcome to Flask — Flask Documentation (2.0.x)

Flask文档(中文)欢迎来到 Flask 的世界 — Flask 中文文档 (2.0.2)

Flask源码 https://github.com/pallets/flask

Flask扩展是指为 Flask 应用增加功能的包(packages)

Flask扩展 Extensions — Flask Documentation (2.0.x)

Flask扩展中文 扩展 — Flask 中文文档 (2.0.2)

Flask框架使用

Flask是一个用Python编写的Web应用程序框架。它由Armin Ronacher开发,他领导一个名为Pocco的国际Python爱好者团队。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎,两者都是Pocco项目。对于这些新手不清楚是正常的不必惊恐不安,在此以上手实践为主,介绍使用flask搭建web网站技术,让我们从简单例子入手吧。

Flask框架不是python的标准库,在使用Flask之前需要安装,可以使用pip命令安装。

【有关安装的详情可参见 Python第三方模块(库、包)安装、卸载与查看及常见问题解决_cnds123的专栏-CSDN博客_python卸载第三方库】。

打开cmd输入:

pip install flask

【若你的电脑上,安装了多个版本的python,想为指定版本如-3.10安装flask

py -3.10 -m pip install flask 】

当安装 Flask 时,以下配套软件会被自动安装。

Werkzeug 用于实现 WSGI ,应用和服务之间的标准 Python 接口。

Jinja 用于渲染页面的模板语言。

以及:

MarkupSafe 与 Jinja 共用,在渲染页面时用于避免不可信的输入,防止注入攻击。

ItsDangerous 保证数据完整性的安全标志数据,用于保护 Flask 的 session cookie.

Click 是一个命令行应用的框架。用于提供 flask 命令,并允许添加自定义 管理命令。

例1、新建一个py文件,名为:FlaskDemo.Py,源码如下:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

我这里,将此源码保存文件名为:FlaskDemo.Py,将此文件放在这个文件夹:D:\PythonWeb编程实践

如何运行这个简单的网站?

按下F5键运行之,参见下图:

更常用的是用命令行运行,先打开cmd再输入

Python D:\PythonWeb编程实践\FlaskDemo.py

然后,再用浏览器打开 http://127.0.0.1:5000 http://locahost:5000, 就可以看到一个显示 "Hello World!" 字样的网页,如下图:

上述程序代码说明

from flask import Flask

导入了 Flask 类。该类的实例将会成为我们的 WSGI 应用。

app = Flask(__name__)

创建Flask对象,__name__是Python中的特殊变量,如果文件作为主程序执行,那么__name__变量的值就是__main__,如果是被其他模块引入,那么__name__的值就是模块名称。

@app.route('/')

def hello_world():

    return 'Hello, World!'

使用 route() 装饰器来告诉 Flask 触发函数 的 URL 。对路径'/'的请求,将转为对hello_world()函数的调用。

代码中使用了装饰器来制定路由url:

@app.route('/')    #调用route路由方法,括号里给定参数,/符号默认为首页

又如:

@app.route('/home/user')    #调用route路由方法,/home/user定位到访问user方法页面

return语句里还可以加入html代码,这样就可以输出一定的格式控制网页内容了,如修改如下:

    return '<h3>welcome to my webpage!</h3><hr><p style="color:red">输出语句测试</p>'

不过要在return里语句加入html长串代码,显然不合适,所以需要使用flask库里的Jinja2模板引擎,调用flask模块里的render_template方法,将静态的html文件传入,同时也可以将数据传输到html文件中显示。此时我们修改一下上述例子代码:

from flask import  Flask, render_template  #导入render_template模块

app=Flask(__name__)

@app.route('/')

def hello_world():   

    return render_template("index.html")   #调用render_template方法/函数,传入html文件参数

【flask之render_template方法/函数 API — Flask 中文文档 (2.0.2)

app.run()

启动了一个非常简单的内建的服务器。

run()主要是为flask应用启动一个server。需要注意的是,请勿在生产设置中使用run(),它不是为了满足生产服务器的安全性和性能要求。相反,请参见部署方式部署方式 — Flask 中文文档 (2.0.2)  对于WSGI服务器建议。

【关于run()方法详情,可参见 API — Flask 中文文档 (2.0.2)

格式:run(host=None, port=None, debug=None, **options)

host:主机,在使用run()启动服务的时候指定的IP地址,默认情况下是127.0.0.1

port:端口,是run()启动服务的时候指定的运行端口,默认是5000

debug:调试,如果需要进入调试模式,可以将这个选项设置成ture

options:选项参数是将server的参数传送到Werkzeug server去处理。

run()方法例子:

1、指定访问的网站地址的方法: (加入host的参数指定当前机器的ip)

app.run(host="192.168.1.109",debug=True)

2、如果机器存在多个网卡或代码放到另外一台机器,让他智能识别(直接输入当前及其的ip即可)

app.run(host="0.0.0.0",debug=True)

3、修改访问的端口号的方法:(加入port的参数指定端口)

app.run(host="192.168.1.109",debug=True, port=81)

4、开启多进程 和 多线程的 方法

开启单进程多线程方法,一般threaded 默认为flase 为单进程单线程,即客户端发10个请求过来 要排队去处理,改为True就是多线程

开启多进程的方法是加processes 一般不填写默认为1 即一个进程

app.run(host="192.168.1.109",debug=True, port=81, threaded=True, processes=1)

例2、下面演示使用独立的HTML文件的简单网站,本例项目结构

本例需要两个文件:

一个py文件,名为:FlaskDemo2.Py,存放位置:D:\PythonWeb编程实践,源码如下:

from flask import Flask ,render_template  #导入render_template模块
app = Flask(__name__)

@app.route("/")
def hello():
    msg="中国,腾飞!"
    return render_template("myIndex.html",data=msg)  #传入html文件参数,且加入变量传递

if __name__ == "__main__":
    app.run(host="127.0.0.1",port=5005)

一个HTML文件,名为:myIndex.html,存放位置:D:\PythonWeb编程实践\templates,特别提示templates这个子文件夹名是render_template模板默认的,源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask技术练习</title>
</head>
<body>
   欢迎来到这个简单的网站
  <hr>
   <p>这是采用render_template模板方法获得的内容:</p>
   <br>
  {{data}}  <!-- 显示出传递过来的变量内容 -->
</body>
</html>

如何运行这个简单的网站?

先打开cmd再输入:

Python D:\PythonWeb编程实践\FlaskDemo2.py,显示如下:

然后,再用浏览器打开 http://127.0.0.1:5005 或http://locahost:5005

例3、前端提交的数据如何传到后端例子

本例使用jQuery和ajax实现数据的异步传输。包含两个文件:

FlaskDemo3.py文件内容如下,存放位置:D:\PythonWeb编程实践

from flask import Flask, render_template, request, jsonify
#创建Flask对象app并初始化
app = Flask(__name__)

#通过python装饰器的方法定义路由地址
@app.route("/")
#定义方法 用jinjia2引擎来渲染页面,并返回一个index.html页面
def root():
    return render_template("index.html")

#app的路由地址"/submit"即为ajax中定义的url地址,采用POST、GET方法均可提交
@app.route("/submit",methods=["GET", "POST"])
#从这里定义具体的函数 返回值均为json格式
def submit():
    #由于POST、GET获取数据的方式不同,需要使用if语句进行判断
    if request.method == "POST":
        name = request.form.get("name")
        age = request.form.get("age")
    if request.method == "GET":
        name = request.args.get("name")
        age = request.args.get("age")
    #如果获取的数据为空
    if len(name) == 0 or len(age) ==0:
        return {'message':"error!"}
    else:
        return {'message':"success!",'name':name,'age':age}

#定义app在8080端口运行
app.run(port=8080)

index.html文件内容如下,存放位置:D:\PythonWeb编程实践\templates

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask技术练习</title>
</head>
<body>
    <!--引入jQuery包用于使用ajax-->
    <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <h3>请输入你的姓名和年龄</h3>
    <!--创建两个input输入框,定义id分别为name,age-->
    <input type="text" id="name" name="name" placeholder="姓名">
    <br>
    <input type="text" id="age" name="age" placeholder="年龄">
    <br>
    <!--创建button按钮,点击则激发submit()事件-->
    <button onclick="submit();">提交</button>
    <script>
        /*在这里编写submit()事件*/
        function submit() {
            $.ajax({
                url: "submit", /*数据提交到submit处*/
                type: "POST",  /*采用POST方法提交*/
                data: { "name": $("#name").val(),"age":$("#age").val()},  /*提交的数据(json格式),从输入框中获取*/
                /*result为后端函数返回的json*/
                success: function (result) {
                    if (result.message == "success!") {
                        alert(result.message+"你的名字是"+result.name+",你的年龄是"+result.age)
                    }
                    else {
                        alert(result.message)
                    }
                }
            });
        }
    </script>
</body>
</html>

如何运行这个简单的网站?

先打开cmd再输入:

Python D:\PythonWeb编程实践\FlaskDemo3.py,显示如下:

然后,再用浏览器打开 http://127.0.0.1:8080 或 http://locahost:8080

输入姓名和年龄后,单击“提交”按钮,将出现“提示”框。

进一步学习:

Python Flask框架:零基础web开发入门教程

https://segmentfault.com/a/1190000017330435

Python 四大主流 Web 编程框架

Python 四大主流 Web 编程框架 - 奋斗的小农 - 博客园

Django入门进阶与项目实战

https://segmentfault.com/a/1190000039401379

(待续)

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值