部署基於pythonwsgiweb框架的工程到函式計算
本文旨在介紹如何將基於 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的內容,請查閱 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,請在位址列敲下回車~)。
程式碼包目錄結構示意圖:
1. 利用pip install -t . flask
命令將flask lib下載到和程式碼在同一個目錄中,如下圖所示:
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):
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
- Sign In
- 提交正確的使用者名稱和密碼
- 提交錯誤的使用者名稱和密碼
函式計算部署 django 工程
本示例中我們會部署一個簡單的基於 django 的工程到函式計算中,runtime 是基於python 2.7 , (python 3 步驟一樣), 具體步驟如下:
完整的示例程式碼包可以點選 django-demo 下載(如果顯示 AccessDenied ,請在位址列敲下回車哈~)。
程式碼包目錄結構示意圖:
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):
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
- signin_form
- 提交正確的使用者名稱和密碼
- 提交錯誤的使用者名稱和密碼
相關文章
- 基於函式計算一鍵部署簡易論壇函式
- 基於函式計算的 BFF 架構函式架構
- 基於RxJava的函式式Reactive Web框架:datamillRxJava函式ReactWeb框架
- 遷移 Express 到函式計算Express函式
- 基於函式計算快速搭建基於人工智慧的目標檢測系統(自己部署自己抽盲盒)函式人工智慧
- 基於函式計算自定義執行時快速部署一個 springboot 專案函式Spring Boot
- “粘土風格”輕鬆拿捏,基於函式計算部署 ComfyUI實現AI生圖函式UIAI
- 基於函式計算部署GPT-Sovits語音生成模型實現AI克隆聲音函式GPT模型AI
- Fission:基於Kubernetes的Serverless函式框架Server函式框架
- 基於函式計算快速搭建Django Blog部落格函式Django
- 基於阿里雲函式計算實現AI推理阿里函式AI
- 基於函式計算快速搭建Zblog部落格系統函式
- 遷移 Spring Boot 到函式計算Spring Boot函式
- 基於函式計算快速搭建Hexo部落格(體驗有禮)函式Hexo
- 計算日期的函式函式
- 基於函式的索引函式索引
- 基於函式計算快速搭建Zblog部落格系統(1500份禮品 自己部署自己抽)函式
- 一鍵開啟 GPU 閒置模式,基於函式計算低成本部署Google Gemma 模型服務GPU模式函式GoGemma模型
- 一鍵開啟 GPU 閒置模式,基於函式計算低成本部署 Google Gemma 模型服務GPU模式函式GoGemma模型
- 一元建站-基於函式計算 + wordpress 構建 serverless 網站函式Server網站
- verilog實現基於Cordic演算法的雙曲函式計算演算法函式
- 基於K8S部署fission函式即服務K8S函式
- Oracle基於函式的索引Oracle函式索引
- 基於SPI的增強式外掛框架設計框架
- 一招識狗!基於函式計算打造柴犬秋田鑑定器函式
- 基於函式計算快速實現《為你寫詩》(阿里雲ECS)函式阿里
- 場景實踐:基於函式計算快速搭建Wordpress部落格系統函式
- 如何使用 Serverless Devs 部署靜態網站到函式計算Serverdev網站函式
- 阿里雲函式計算 VSCode 使用,及部署 Docusaurus阿里函式VSCode
- 【機器學習】SVM核函式的計算機器學習函式
- 基於阿里雲Serverless函式計算開發的疫情資料統計推送機器人阿里Server函式機器人
- OCP之基於函式的索引函式索引
- 用RMI實現基於Java的分散式計算(轉)Java分散式
- 從零到一帶你手寫基於Redis的分散式鎖框架Redis分散式框架
- 從雲端計算到函式計算函式
- Java基於SSM框架的計算機學院管理系統(3)JavaSSM框架計算機
- 轉轉基於MQ的分散式重試框架設計方案MQ分散式框架
- 計算 CRC32 的逆函式函式