zxpnet网站 zxpnet网站
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

zxpnet

一个爱学习的java开发攻城狮
首页
前端
后端服务器
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • python基础

    • python3基础
    • python爬虫开发
    • python web开发
      • WSGI原理
        • wsgi服务器wsgiref
        • WSGI 服务器作用
      • Django 入门与进阶(上)
      • 05 第二阶 Django 入门与进阶(下)
      • 前端基础 HTML\CSS\JS
      • 前端UI框架 Layui
      • Web项目实战案例 K8s Dashboard(上)
      • Web项目实战案例 K8s Dashboard(中)
      • Web项目实战案例 K8s Dashboard(下)
      • flask
        • 安装
        • 蓝图
        • jinja2模板
        • 过滤器
        • 代码提示和高亮
    • wxpy微信开发
    • 尹成python
    • python常见库
    • python金融开发
    • python文件操作
    • python正则表达式
    • python面向对象
    • python模块化
    • python线程与并发
    • python数据库
    • python整合redis
  • python爬虫

  • python库

  • 树莓派
  • Arduino
  • STM32
  • kali linux
  • python培训班
  • python
  • python基础
shollin
2022-10-19
目录

python web开发

# WSGI原理

WSGI(Web Server Gateway Interface) ,作为一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。

为什么需要WSGI 在Web部署的方案上,有一个方案是目前应用最广泛的:

  • 首先,部署一个Web服务器专门用来处理HTTP协议层面相关的事情,比如如何在一个物理机上提供多个不同的Web服务(单IP多域名,单IP多端口等)这种事情。
  • 然后,部署一个用各种语言编写(Java, PHP, Python, Ruby等)的应用程序,这个应用程序会从Web服务器上接收客户端的请求,处理完成后,再返回响应给Web服务器,最后由Web服务器返回给客户端。

那么 Web Server 和 Application 之间就要知道如何进行交互。为了定义Web服务器和应用程序之间的交互过程,就形成了很多不同的规范。比如改进CGI性能的FasgCGI,Java专用的Servlet规范,还有Python专用的WSGI规范等。提出这些规范的目的就是为了定义统一的标准,提升程序的可移植性。

WSGI简介 (opens new window)

image-20230419110853195

  • WSGI (Web Server Gateway lnterface) 主要规定了服务器端和应用程序间的接口

  • Web Server:主要负责HTTP协议请求和响应,但不一定支持WSGI接口访问. 接收来自客户端的HTTP,然后将请求交给Web Application

  • Web Application:根据请求来调用相应的处理逻辑,生成response;通过Web Server把response发送给客户端

image-20230419111706237

image-20230419113529637

Server端将http请求相关信息、wsgi变量以及一些服务端环境变量添加到environ传给Application端,Application端处理完所需信息后将http状态码和header通过start_response回调函数传给Server端,而http响应body则以返回值的形式传给服务端。 见wsgiref.simple_server源码,参数app为可调用对象,请求处理交由WSGIRequestHandler

可调用对象: 函数、类(callable)、实例instance

def make_server( host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):
    """Create a new WSGI server listening on `host` and `port` for `app`"""
    server = server_class((host, port), handler_class)
    server.set_app(app)
    return server
1
2
3
4
5
def demo_app(environ,start_response):
    from io import StringIO
    stdout = StringIO()
    print("Hello world!", file=stdout)
    print(file=stdout)
    h = sorted(environ.items())
    for k,v in h:
        print(k,'=',repr(v), file=stdout)
    start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]
1
2
3
4
5
6
7
8
9
10

# wsgi服务器wsgiref

app中需要准备内容,在return之前,需要使用start_response函数准备状态码和响应头的数据。 return可迭代对象,元素是内容的一 部分,bytes类型,参考wsgiref.simple_server.demo_app函数

wsgiref是Python提供的一个WSGI参考实现库,不适合生产环境使用。wsgiref.simple_server 模块实现一个简单的WSGI HTTP服务器

# WSGI server in Python
from wsgiref.simple_server import make_server

# 方式一:函数形式 httpd= make_server("127.0.0.1",8081, app);
def app(environ, start_response):
    response_body = ['%s: %s' % (key, value)
                     for key, value in sorted(environ.items())]
    response_body = '\n'.join(response_body)
    status = '200 OK'
    response_headers = [('Content-Type', 'text/plain'), ('Content-Length', str(len(response_body)))]
    start_response(status, response_headers)

    return [response_body.encode('utf8')]

# 方式二:类形式,需为可迭代对象 httpd= make_server("127.0.0.1",8081, MyApp);
class MyApp():
    def __init__(self, environ, start_response):
        self.environ = environ
        self.start_response = start_response

    def __iter__(self): #需返回可迭代对象 iter(...)
        self.start_response("200 OK", [('Content-Type', 'text/plain'),('Content-Type','text/plain; charset=utf-8')])
        yield from ["类形式".encode()];

#方式三:实例形式,callabe httpd= make_server("127.0.0.1",8081, App());
class App():

    def __call__(self, environ, start_response):
        start_response("200 OK", [('Content-Type', 'text/plain'), ('Content-Type', 'text/plain; charset=utf-8')])
        return ["类实例形式".encode()];

httpd = make_server('localhost',8080,application)

# 请求处理完退出,执行一次
#httpd.handle_request()

httpd.serve_forever()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# WSGI 服务器作用

  • 监听HTTP服务端口 (TCPServer,默认端口80)
  • 接收浏览器端的HTTP请求并解析封装成environ环境数据
  • 负责调用应用程序,将environ数据和start response方法两个实参传入给Application
  • 将应用程序返回的正文封装成HTTP响应报文返回浏览器端

image-20230419184203714

# Django 入门与进阶(上)

​ 01-Django介绍,开发环境准备

django-admin startproject mysite
cd mysite
python manage.py startapp blog
# 将应用添加到setting.py文件的INSTALLED_APPS 变量中, 'blog.apps.BlogConfig',
python manage.py runserver
1
2
3
4
5

image-20221231150327958

image-20221231150906836

02-Pycharm,创建第一个项目,Django工作流程 ​ 03-URL路由系统:配置、URL正则表达式匹配 ​ 04-视图:HttpRequest详解1 ​ 05-视图:HttpRequest详解2,HttpResponse详解 ​ 06-模板:变量、标签、过滤器、继承、导入等 ​

参考: django4.0基础教程:通过指令创建django项目和应用-django教程-Django社区,Django中文网! (opens new window)

Django 文档 | Django 文档 | Django (djangoproject.com) (opens new window)

# 05 第二阶 Django 入门与进阶(下)

​ 01-数据模型:ORM、Model,ORM基本增删改查 ​ 02-数据模型:内置管理后台,配置MySQL数据库 ​ 03-数据模型:QuerySet序列化,一对一关系模型 ​ 04-数据模型:一对多、多对多关系模型 ​ 05-多对多关系模型2,内置用户认证系统 ​ 06-auth模块、Session与Cookie应用,CSRF防御 ​

# 前端基础 HTML\CSS\JS

​ 01-HTML:基本概念,常用标签 ​ 02-CSS:基本使用,常用选择器、常用样式属性2 ​ 03-javaScript:基本使用,事件,选择器 ​ 04-JavaScript:数据类型,流程控制,表单验证 ​ 05-JavaScript:函数,定时器,正则表达式 ​ 06-jQuery:基本使用,选择器,常见HTML操作 ​ 07-jQuery:前端与后端数据交互 Ajax

# 前端UI框架 Layui

​ 01-Layui介绍,基本使用,后台布局,栅格系统 ​ 02-卡片面板,按钮,表单,上传文件 ​ 03-数据表格,弹出框 ​

# Web项目实战案例 K8s Dashboard(上)

​ 01-项目概述,API介绍,K8s认证方式 ​ 02-K8s API使用案例,K8s平台登录页面认证实现 ​ 03-K8s管理平台布局.mp41 o8 E6 [7 q) w/ K ​ 04-前后端开发功能:NS、PV、Node、DP ​

# Web项目实战案例 K8s Dashboard(中)

​ 01-前后端开发功能:DS、STS、Pod ​ 02-前后端开发功能:SVC、ING、PVC、CM、Se ​ 03-前后端开发功能:初步优化 ​ 04-前后端开发功能:创建资源K8s资源 ​ 05-前后端开发功能:查看YAML ​ 06前后端开发功能:Node详情页 ​ 07前后端开发功能:DP详情页和Pod日志 ​ 08-前后端开发功能:容器终端 ​

# Web项目实战案例 K8s Dashboard(下)

​ 01-前后端开发功能:仪表盘 ​ 02-生产环境部署Django项目

【No1728】python web运维开发中级视频教程 网盘链接:https://pan.baidu.com/s/1sRoaoHjDZL_5vnwCGyQuCg 提取密码:403x 解压密码:www.javaxxz.com_*UH&5Gj

# flask

Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。

# 安装

pip install flask
1

编程快速入门 http://docs.jinkan.org/docs/flask/quickstart.html#quickstart 在项目根目录下构建

  • webapp包目录,存放flask代码,包内有_init_.py文件
  • templates目录,存放模板文件
  • static目录,存放is、css等静态文件。其下建立js目录,放入jquery、echarts的is文件
  • app.py,入口文件
# Flask实例的源码:
class Flask(_PackageBoundObject):
    def __init__(self, import_name,  # 指定应用的名字和工程目录,默认为__name__
                static_path=None,  #  是静态文件存放的路径,会赋值给static_url_path参数
                static_url_path=None,  # 设置静态文件路由的前缀,默认为“/static”
                static_folder='static', # 静态文件的存放目录, 默认值为"static"
                template_folder='templates', # 模板文件的存放目录,默认值为"templates"
                instance_path=None, # 设置配置文件的路径,在instance_relative_config=True情况下生效
                instance_relative_config=False # 设置为True表示配置文件相对于实例路径而不是根路径
                root_path=None) # #  应用程序的根路径
1
2
3
4
5
6
7
8
9
10
from webapps import app
if __name__=="__main__":
    app.run(debug=True,port=5000) #调试模式,热启动
1
2
3

image-20230420151215285

# 蓝图

Flask中,基本上都是route装饰器和视图函数的映射,如果函数很多,代码组织结构会非常乱。蓝图Blueprint,就是Flask中模块化的技术

Blueprint构造参数

  • name,蓝图名字,注册在app的蓝图字典中用的key
  • import_name,用来计算蓝图模块所在的路径,一般写__name__
  • root_path,指定蓝图模块所在的路径,如果为None,使用import_name计算得到
  • template folder
    • 相对于蓝图的root_path,假设就是books.py的目录path1,那么上面的模板文件路径0path1/temp/xxx.html
    • 模板是一批搜索路径,会依次搜索这些模板路径,找到第一个返回。如果在找到本蓝图模板之前,有一个同名的模板,那么本蓝图模板文件就不能被找到了
    • url_prefix,指定本蓝图模块的路径前缀。app.register_hlueprint注册蓝图时,也可以对当前蓝图指定url_prefix,它将覆盖蓝图中的定义
from flask import Blueprint, Flask, Request, Response, jsonify, render_template, request, redirect, url_for

book = Blueprint("book",__name__, url_prefix="/book", template_folder="tpl/book");

@book.route('/saveUI')
def saveUI():
    return render_template("saveUI.html"); # 模板默认在templates目录下找
1
2
3
4
5
6
7
import io
import flask
from flask import Flask, Request, Response, jsonify, render_template, request, redirect, url_for

# 初始化应用,指定模板目录template_folder、静态目录static_folder,见构造init方法
app:Flask = Flask(import_name=__name__, static_url_path="/", template_folder="templates") # 静态默认访问/static

# 添加模块
from .book  import book
app.register_blueprint(book); # url_prefix路径前缀,会覆盖模块里
1
2
3
4
5
6
7
8
9
10

# jinja2模板

pip install Jinja2
1
<h2>九九乘法表:</h2>
{% for i in range(1,10) %}

    {% for j in range(1,10) %}
    {{i}} X {{ j }} = {{"%s"|format( i*j) }} <br/>
        {% if j%9==0 %}
            <br/>
        {% endif %}
    {% endfor %}
{% endfor %}
1
2
3
4
5
6
7
8
9
10

# 过滤器

变量可以通过 过滤器 修改。过滤器与变量用管道符号( | )分割,并且也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。

例如 会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。过滤器接受带圆括号的参数,如同函数调用。这个例子会 把一个列表用逗号连接起来: 。

内置过滤器清单 (opens new window)

jinja2中文文档 (opens new window)

# 代码提示和高亮

image-20230420160840156

参考:

Python之flask框架 (opens new window)

python爬虫开发
wxpy微信开发

← python爬虫开发 wxpy微信开发→

最近更新
01
国际象棋
09-15
02
成语
09-15
03
自然拼读
09-15
更多文章>
Theme by Vdoing | Copyright © 2019-2023 zxpnet | 粤ICP备14079330号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式