部署基于 python wsgi web 框架的工程到函数计算

简介: 本文旨在介绍如何将基于 WSGI web 框架构建的工程部署到函数计算 python runtime 的具体操作过程,在介绍操作过程之前,先了解几个概念。 相关概念导读 函数计算 HTTP 触发器 HTTP 触发器是众多函数计算触发器中的一种,通过发送 HTTP 请求触发函数执行。

本文旨在介绍如何将基于 WSGI web 框架构建的工程部署到函数计算 python runtime 的具体操作过程,在介绍操作过程之前,先了解几个概念。

相关概念导读

函数计算 HTTP 触发器

HTTP 触发器是众多函数计算触发器中的一种,通过发送 HTTP 请求触发函数执行。主要适用于快速构建 Web 服务等场景。HTTP 触发器支持 HEAD、POST、PUT、GET 和 DELETE 方式触发函数。具体详情可以参考 HTTP 触发器

什么是WSGI

WSGI的全称是 Web Server Gateway Interface,简单翻译就是 Web 服务器网关接口。具体来说,WSGI 是一个规范,定义了 Web 服务器如何与 Python 应用程序进行交互,使得使用 Python 写的 Web 应用程序可以和 Web 服务器对接起来。最新官方版本是在 Python 的 PEP-3333 定义的。

WSGI 如何工作

在 WSGI 中定义了两个角色,Web 服务器端称为 server 或者 gateway,应用程序端称为 application 或者 framework(因为 WSGI 的应用程序端的规范一般都是由具体的框架来实现的,下面统一使用 server 和 application 这两个术语,WSGI 相当于是 Web 服务器和 Python 应用程序之间的桥梁。
server 端会先收到用户的请求,然后会根据规范的要求调用 application 端,然后 server 会将调用 application 返回的结果封装成 HTTP 响应后再发送给客户端,如下图所示:

wsgi-fc

如果想了解更多关于WSGI的内容,请查阅 PEP-3333

函数计算遇见 WSGI

FC python runtime 是 server,用户的函数是 application,applicaiton 可以完全自己实现,也可以基于 wsgi 的 web 框架上进行函数开发,具体可以参考 HTTP 触发器 Python-Runtime , 本文主要讲解如何运用 python wsgi 的 web 框架开发的工程部署到函数计算环境中。

Frameworks that run on WSGI

目前有很不少 Frameworks 是基于 WSGI 协议的,比如 Flask,Django 等,具体可以参考 Frameworks that run on WSGI, 本文讲解两个框架的的工程如何部署在函数计算中:

函数计算部署flask工程

本示例中我们会部署一个简单的基于 flask 的工程到函数计算中,runtime 是基于python2.7 , ( python3 步骤一样),具体步骤如下:

完整的示例代码包可以点击 [flask-demo]下载 (如果显示 AccessDenied,请在地址栏敲下回车~)。
代码包目录结构示意图:
f

1. 利用pip install -t . flask 命令将flask lib下载到和代码在同一个目录中,如下图所示:

flask
main.py 代码如下:

  #!/usr/bin/env python
# coding=utf-8
from flask import Flask
from flask import request
from flask import make_response
import urlparse 

app = Flask(__name__)

base_path = ''

@app.route('/', methods=['GET', 'POST'])
def home():
    resp = make_response('<h1>Home<h1>', 200)
    return resp

@app.route('/signin', methods=['GET'])
def signin_form():
    html = '''<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>'''

    resp = make_response(html, 200)
    return resp

@app.route('/signin', methods=['POST'])
def signin():
    if request.form['username']=='admin' and request.form['password']=='password':
        html = '<h3>Hello, admin!</h3>'
    else:
        html = '<h3>Bad username or password.</h3>'
    resp = make_response(html, 200)
    return resp

def handler(environ, start_response):
    # 如果没有使用自定义域名
    if environ['fc.request_uri'].startswith("/2016-08-15/proxy"):
      parsed_tuple = urlparse.urlparse(environ['fc.request_uri'])
      li = parsed_tuple.path.split('/')
      global base_path
      if not base_path:
          base_path = "/".join(li[0:5])

      context = environ['fc.context']
      environ['HTTP_HOST'] = '{}.{}.fc.aliyuncs.com'.format(context.account_id, context.region)
      environ['SCRIPT_NAME'] = base_path + '/'

    return app(environ, start_response)
2. 执行下面的脚本,创建对应的 service,function 和 HTTP 触发器
  #!/usr/bin/env python
  # coding=utf-8
  import fc2
  client = fc2.Client(
      endpoint='<your endpoint>', # your endpoint
      accessKeyID='<your ak_id>', # your ak_id
      accessKeySecret='<your ak_secret>' # your ak_secret
      )

  service_name = 'flask-demo'
  funciton_name = 'test'
  trigger_name = "my_trigger"

  client.create_service(service_name)

  client.create_function(
      service_name, funciton_name, 'python2.7',  'main.handler',
      codeDir='./flaskDir/')

  res = client.get_function(service_name, funciton_name)
  print res.data
  trigger_config = {
   
              "authType" : "anonymous",
              "methods" : ["GET", "POST"],
      }
  client.create_trigger(service_name, funciton_name , trigger_name, "http", trigger_config, "dummy_arn", "")
  print client.get_trigger(service_name,  funciton_name, trigger_name).data
3. 脚本执行成功后,给函数创建了 HTTP 触发器,就可以通过 url ($(account-id).$(region).fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world) 访问函数,打开浏览器可以看到如下效果:

注:如果 account-id 为 12345 ,region 为 cn-shanghai , serviceName为flask-demo, functionName 为test, 那么访问函数的 url 就是 12345.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/flask-demo/test/

  • Home
    p1

  • Sign In
    p2

  • 提交正确的用户名和密码
    p3

  • 提交错误的用户名和密码
    p4

函数计算部署 django 工程

本示例中我们会部署一个简单的基于 django 的工程到函数计算中,runtime 是基于python 2.7 , (python 3 步骤一样), 具体步骤如下:

完整的示例代码包可以点击 django-demo 下载(如果显示 AccessDenied ,请在地址栏敲下回车哈~)。
代码包目录结构示意图:
d

1. 利用pip install -t . django 命令将 django lib 下载到和代码在同一个目录中。

main.py 代码如下:

# coding=utf-8
import sys
import os

# load local django
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "HelloWorld"))

import django

print (django.__version__)

base_path = None

from HelloWorld.wsgi import application

def handler(environ, start_response):
      # 如果没有使用自定义域名
    if environ['fc.request_uri'].startswith("/2016-08-15/proxy"):
      import urlparse    
      parsed_tuple = urlparse.urlparse(environ['fc.request_uri'])
      li = parsed_tuple.path.split('/')
      global base_path
      if not base_path:
          base_path = "/".join(li[0:5])

      context = environ['fc.context']
      environ['HTTP_HOST'] = '{}.{}.fc.aliyuncs.com'.format(context.account_id, context.region)
      environ['SCRIPT_NAME'] = base_path + '/'

    return application(environ, start_response)
2. HelloWorld 工程目录如下:
  |____HelloWorld
  | |______init__.py
  | |____view.py
  | |____settings.py # 视图文件
  | |____urls.py # 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  | |____wsgi.py 
  |____db.sqlite3
  |____manage.py

urls.py 代码如下:

  from django.conf.urls import url
  from django.contrib import admin
  from . import view

  urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^$', view.home),
      url(r'^signin$', view.signin),
      url(r'^signin_form$', view.signin_form),
  ]

view.py 代码如下:

# coding=utf-8
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

def home(request):
    return HttpResponse("<h1>Home</h1>", status=200)

def signin_form(request):
    # action url 中的service_name,function_name need replace
    html = '''<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>'''

    resp = HttpResponse(html,status=200)
    return resp

@csrf_exempt
def signin(request):
    if request.POST['username']=='admin' and request.POST['password']=='password':
        html = '<h3>Hello, admin!</h3>'
    else:
        html = '<h3>Bad username or password.</h3>'
    resp = HttpResponse(html, status=200)
    return resp
3. 执行下面的脚本,创建对应的 service ,function 和 HTTP 触发器
  #!/usr/bin/env python
  # coding=utf-8
  import fc2
  client = fc2.Client(
      endpoint='<your endpoint>', # your endpoint
      accessKeyID='<your ak_id>', # your ak_id
      accessKeySecret='<your ak_secret>' # your ak_secret
      )

  service_name = 'django-demo'
  funciton_name = 'test'
  trigger_name = "my_trigger"

  client.create_service(service_name)

  client.create_function(
      service_name, funciton_name, 'python2.7',  'main.handler',
      codeDir='./djangoDir/')

  res = client.get_function(service_name, funciton_name)
  print res.data
  trigger_config = {
   
              "authType" : "anonymous",
              "methods" : ["GET", "POST"],
      }
  client.create_trigger(service_name, funciton_name , trigger_name, "http", trigger_config, "dummy_arn", "")
  print client.get_trigger(service_name,  funciton_name, trigger_name).data
4. 脚本执行成功后,给函数创建了 HTTP 触发器,就可以通过 url ($(account-id).$(region).fc.aliyuncs.com/2016-08-15/proxy/serviceName/functionName/action?hello=world) 访问函数,打开浏览器可以看到如下效果:

注:如果 account-id 为 12345,region 为 cn-shanghai , serviceName 为 fcService , functionName 为 test , 那么访问函数的 url 就是 12345.cn-shanghai.fc.aliyuncs.com/2016-08-15/proxy/fcService/test/

  • home

d1

  • signin_form

d2

  • 提交正确的用户名和密码

d3

  • 提交错误的用户名和密码

d4

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
运维 数据可视化 C++
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
2025年热门Web化容器部署工具对比:Portainer与Websoft9。Portainer以轻量可视化管理见长,适合技术团队运维;Websoft9则提供一站式应用部署与容器管理,内置丰富开源模板,降低中小企业部署门槛。两者各有优势,助力企业提升容器化效率。
765 1
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
|
Java 应用服务中间件 Docker
java-web部署模式概述
本文总结了现代 Web 开发中 Spring Boot HTTP 接口服务的常见部署模式,包括 Servlet 与 Reactive 模型、内置与外置容器、物理机 / 容器 / 云环境部署及单体与微服务架构,帮助开发者根据实际场景选择合适的方案。
836 25
|
JavaScript 前端开发 机器人
【Azure Bot Service】在中国区Azure上部署机器人的 Python 版配置
本文介绍了在中国区Azure上使用Python SDK配置Azure Bot Service时遇到的问题及解决方案,涵盖参数设置与适配器配置,适用于希望在Azure中国区部署Python机器人的开发者。
366 9
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
1016 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
1242 0
|
人工智能 安全 程序员
用 Colab 和 ngrok 免费部署你的 Web UI 项目,随时随地访问!
用 Colab 和 ngrok 免费部署你的 Web UI 项目,随时随地访问!
1883 12
|
安全 搜索推荐 Serverless
HarmonyOS5云服务技术分享--Serverless抽奖模板部署
本文详细介绍了如何使用华为HarmonyOS的Serverless模板快速搭建抽奖活动,手把手教你完成从前期准备到部署上线的全流程。内容涵盖账号注册、云函数配置、参数调整、托管上线及个性化定制等关键步骤,并附带常见问题解答和避坑指南。即使是零基础用户,也能轻松上手,快速实现抽奖活动的开发与部署。适合希望高效构建互动应用的开发者参考学习。
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
848 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。

热门文章

最新文章

相关产品

  • 函数计算
  • 推荐镜像

    更多