NiceLeeのBlog 用爱发电 bilibili~

Vercel Serverless使用笔记(Python版)

2020-11-16
nIceLee

阅读:


服务器冇得了,只能白嫖了,就这样。

基础命令

安装

npm i -g vercel             # npm
yarn global add vercel      # yarn

使用

vercel init     # 选择一个示例项目(初始化)
# 可以根据模板初始化创建,不复杂的话也可以自己弄,功能简单的话几个文件就差不多了

cd <PROJECT>    # 进入目录
vercel dev --debug  # 本地开发测试
vercel          # 部署到云服务
vercel -prod    # 部署到云服务生产环境

支持语言

  • 官方支持Node.jsGoPythonRuby
  • 社区支持php。在配置里面做好相应配置即可。例如:
      {
        "functions": {
          "api/test.php": {
            "runtime": "vercel-php@0.1.0"
          }
        }
      }
    

配置

详情可以参考https://vercel.com/docs/configuration
在这里以一个简单的配置vercel.json为例,解释一下比较有用的参数。

{
  "version": 2,
  "builds": [   // 这里需要注意,没有罗列到builds的资源是无法访问或使用的
    { "src": "*.html", "use": "@vercel/static" },   // 静态资源
    { "src": "api/*.py", "use": "@vercel/python" }  // 因为是python写的云函数,所以...
  ],
  "routes": [
    { "src": "/", "dest": "/index.html" },          // 这里把主页定位到相应的网页,不然默认会是访问目录
    { "src": "/api/date", "dest": "/api/date.py" }, // 一个官方的基于BaseHTTPRequestHandler简单例子,返回当前时间  
    { "src": "/api/ip/(.*)", "dest": "/api/ip_query.py" }, // 一个更加复杂的例子,获取域名对应的ip
    { "src": "/api/(.*)", "dest": "/api/web.py" },  // 一个基于Flask的简单例子,返回访问的路径和参数
    { "src": "/(.*)", "status": 404, "dest": "/404.html" } // 把其它的访问路径定位到自定义的404页面
  ]
}

简单例子

这里以Python为例,与上一节的配置相对应。

基于BaseHTTPRequestHandler

date.py

from http.server import BaseHTTPRequestHandler
from datetime import datetime

class handler(BaseHTTPRequestHandler):

  def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/plain')
    self.end_headers()
    self.wfile.write(str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')).encode())
    return

ip_query.py

from http.server import BaseHTTPRequestHandler, HTTPServer
import socket

class handler(BaseHTTPRequestHandler):

  def do_GET(self):
    path = str(self.path)
    try:
        domain = path[path.rindex("/")+1:]
        print(domain)
        ip = socket.gethostbyname(domain)   
    except:
        text = 'path is: %s, \n Error happens\n'%(path)
    else:
        text = 'domain is: %s \n ip is: %s\n'%(domain, ip)
    self.send_response(200)
    self.send_header('Content-type', 'text/plain')
    self.end_headers()
    self.wfile.write(text.encode())
    return

if __name__ == "__main__":
    http_server = HTTPServer(('', int(8888)), handler)
    http_server.serve_forever() 

基于Flask

这里需要注意,在requirements.txt中加入依赖flask==1.0.2
web.py

from flask import Flask, Response, request
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    print(request.args)
    key = request.args.get('key')
    return Response("<h1>Flask</h1><p>You visited: /%s</p><p>key=%s</p>" % (path,key), mimetype="text/html")
    
if __name__ == "__main__":
    app.run(debug = True)

其它

测试地址

https://test-feql0j31g.vercel.app
https://test-feql0j31g.vercel.app/api/ip/github.com
https://test-feql0j31g.vercel.app/api/test?key=tt123

示例代码

https://github.com/nICEnnnnnnnLee/vercel-serverless-python


内容
隐藏