本文由腾讯云 社区自动同步,原文地址 https://stackoverflow.club/article/blogseo_jinja2_scf/
背景
前段时间对博客进行了改版,详情可以看《使用Baas和Vue Element UI的动态博客》. 由于使用了Vue,导致SEO出现困难。
当时提出了《单页面Vue网站无服务端实现静态化SEO》, 但只是一个设想,现在要具体实现。
目的
其实目的很简单,发送一些文章信息到云函数,用模板渲染函数填充到模板页面,保存到COS中即可。
技术选型
主要是模板渲染引擎,考虑了Django和Flask。但是发现他们都是一整套代码运行,无法将单独的渲染功能剥离出来。
后来发现Flask使用的是Jinja2,就采用了该模板引擎。
编码
scf:腾讯云无服务器云函数 cos: 腾讯云对象存储
scf获取json
所有的scf主函数都必须有event
和context
参数,scf接收到的post内容就在event['body']
中
def main_handler(event, context):
print(event['body'])
scf渲染
这里是从cos中读取模板页面,然后渲染获得html页面。
代码语言:txt复制def getHtml(json_meta):
raw_content = getCOS('template/index.html')
'''
with open("./templates/index.html", 'r', encoding='utf8') as f:
temp = f.read()
'''
temp = raw_content.decode('utf8')
template = Template(temp)
ret = template.render(json.loads(json_meta))
return ret
scf保存到cos
保存html页面需要两个信息,一个是html文件内容,另一个是保存路径。路径信息已经包含在post内容中了,取出来即可。
在渲染和获取路径信息时分别解析了json,可能有点多余。
代码语言:txt复制body_dict = json.loads(event['body'])
if 'url' in body_dict:
path = body_dict['url']
if path.endswith('/'):
path = path 'index.html'
cos_ret = saveCOS(html_content, path)
一些错误
由于不太会用api网关,导致使用api网关触发的云函数时总是出错,
代码语言:txt复制{"errno":403,"error":"Invalid scf response. expected scf response valid JSON."}
经观察Demo,发现需要这样返回
代码语言:txt复制# -*- coding: utf8 -*-
import json
def main_handler(event, context):
print("Received event: " json.dumps(event, indent = 2))
print("Received context: " str(context))
print("Hello world")
return {
"isBase64Encoded": False,
"statusCode": 200,
"headers": {'Content-Type': 'application/json'},
"body": json.dumps({'name':'wenfengand'})
}