对于python+jinja2实现接口数据批量生成工具感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍python自动生成接口文档,并为您提供关于AWSLambdaPythonJinja2模板从
对于python+jinja2 实现接口数据批量生成工具感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍python自动生成接口文档,并为您提供关于AWS Lambda Python Jinja2 模板从 S3 加载 json、Flask 和 Jinja2 - 过滤器是 jinja2.exceptions.UndefinedError: 'convert_date_to_name' 未定义、jinja2 如何检索变量的值以在 if 语句中使用它 jinja2、Jinja2:使用 jinja2的有用信息。
本文目录一览:- python+jinja2 实现接口数据批量生成工具(python自动生成接口文档)
- AWS Lambda Python Jinja2 模板从 S3 加载 json
- Flask 和 Jinja2 - 过滤器是 jinja2.exceptions.UndefinedError: 'convert_date_to_name' 未定义
- jinja2 如何检索变量的值以在 if 语句中使用它 jinja2
- Jinja2:使用 jinja2
python+jinja2 实现接口数据批量生成工具(python自动生成接口文档)
在做接口测试的时候,我们经常会遇到一种情况就是要对接口的参数进行各种可能的校验,手动修改很麻烦,尤其是那些接口参数有几十个甚至更多的,有没有一种方法可以批量的对指定参数做生成处理呢。
答案是肯定的!
python 的 jinja2 模板库可以很好的满足我们的需求,通过维护一个原始数据模板,将我们想要动态生成的变量模板化,就可以实现需求。
现在我们有这样的一个请求数据
{
"abc":"123",
"p2p":"123",
"smid":"20180807220733939b66d80092eea34ce9e77f30bedff12345b7d5a3faa11b",
"test":{
"test1":"1",
"test2":"2"
},
"test3":"3"
}
如果想对其中的 smid 字段进行批量修改并生成新的请求数据就可以进行如下操作:
1、首先新建一个名为 fp_template.txt 的文本文件;
2、将上面的接口请求数据复制粘贴进这个 txt 文件中,我们以此作为 “模板文件”;
3、新建一个 predata 文件夹用来存放生成后的数据文件;
4、对 smid 字段进行模板化(模板格式可以参考 jinja2 的语法,这里不做赘述),于是上面的请求参数就变成了下面这样:
{
"abc":"123",
"p2p":"123",
"smid":"{{ smid }}",
"test":{
"test1":"1",
"test2":"2"
},
"test3":"3"
}
实现代码代码如下:
# -*- coding: UTF-8 -*-
from jinja2 import Environment,FileSystemLoader
import os
class DataTemplateFaker:
def __init__(self):
self.aesPath = os.getcwd()#获取启动路径
self.resultPath = self.aesPath + "/predata/"#指定用来保存生成数据的路径
self.templateFile = "fp_template.txt"
#修改我们要批量生成smid的格式
def init_smid(self,start,end):
smidArg = [x for x in range(start, end)]
re = []
for n in smidArg:
re.append("20180807220733939b66d80092eea34ce9e77f30bedff" + str(n) + "b7d5a3faa11b")
return re
#操作模板文件
def preContent(self,arg):
env = Environment(loader=FileSystemLoader(''./''))
tpl = env.get_template(self.templateFile)
renderContent = tpl.render(smid=arg)
return renderContent
#通过修改的smid列表批量替换模板文件并写入指定文件中
def makeContent(self,preList):
x = 0
for i in preList:
x = x + 1
filename = str(self.resultPath) + ''data_'' + str(x) + ''.txt'' #用以区分存放新生成的请求数据(也可以写到一个文件中)
renderContent = self.preContent(i)
with open(filename, ''w'') as f:
f.writelines(renderContent)
f.close()
if __name__ == "__main__":
AT = DataTemplateFaker()
reList = AT.init_smid(1,10)#控制生成数据的范围
AT.makeContent(reList)
运行程序,就能得到新生成的数据
当然,我们也可以对其他的参数进行指定修改,如修改 p2p,只需要修改模板文件:
{
"abc":"123",
"p2p":"{{ p2p }}",
"smid":"20180807220733939b66d80092eea34ce9e77f30bedff12345b7d5a3faa11b",
"test":{
"test1":"1",
"test2":"2"
},
"test3":"3"
}
然后在代码中加入一个方法 init_p2p ()
# -*- coding: UTF-8 -*-
from jinja2 import Environment,FileSystemLoader
import os
class DataTemplateFaker:
def __init__(self):
self.aesPath = os.getcwd()#获取启动路径
self.resultPath = self.aesPath + "/predata/"#指定用来保存生成数据的路径
self.templateFile = "fp_template.txt"
#修改我们要批量生成smid的格式
def init_smid(self,start,end):
smidArg = [x for x in range(start, end)]
re = []
for n in smidArg:
re.append("20180807220733939b66d80092eea34ce9e77f30bedff" + str(n) + "b7d5a3faa11b")
return re
#修改我们要批量生成p2p的格式
def init_p2p(self,start,end):
p2pArg = [x for x in range(start, end)]
return p2pArg
#操作模板文件
def preContent(self,arg):
env = Environment(loader=FileSystemLoader(''./''))
tpl = env.get_template(self.templateFile)
renderContent = tpl.render(smid=arg)
return renderContent
#通过修改的smid列表批量替换模板文件并写入指定文件中
def makeContent(self,preList):
x = 0
for i in preList:
x = x + 1
filename = str(self.resultPath) + ''data_'' + str(x) + ''.txt'' #用以区分存放新生成的请求数据(也可以写到一个文件中)
renderContent = self.preContent(i)
with open(filename, ''w'') as f:
f.writelines(renderContent)
f.close()
if __name__ == "__main__":
AT = DataTemplateFaker()
reList = AT.init_p2p(1,10)#控制生成数据的范围
AT.makeContent(reList)
这只是一个很简单的 demo,当然还有很多可优化的地方,比如多字段同时修改、引入 faker 库进行关联生成伪造数据等,越是复杂且参数繁多的接口越适用,其他的方法就可以天马行空,任君发挥了。
AWS Lambda Python Jinja2 模板从 S3 加载 json
如何解决AWS Lambda Python Jinja2 模板从 S3 加载 json
我希望从 S3 存储桶中获取一个 json 结构的 Jinja2 模板(一个带有 j2 变量的 json)并使用键值进行渲染。我看到 2 个需要帮助的障碍:
- 模板模块具有 PackageLoader 和类似功能,但我无法从 S3 存储桶中找到加载器。如果没有,将 S3 对象下载到我的 AWS lambda 内存是一个不错的选择吗?
operator new
- 如何使用 Template() 加载 json 样式的 jinja 文件?当我尝试下面的代码时,它错误地指出“用双引号括起来的期望属性名称”
env = Environment(loader=FileSystemloader (OR PackageLoader(''app'',''templates''))
template_source = env.loader.get_source(env,''sample.json'')
感谢您的投入,谢谢。
Flask 和 Jinja2 - 过滤器是 jinja2.exceptions.UndefinedError: 'convert_date_to_name' 未定义
如何解决Flask 和 Jinja2 - 过滤器是 jinja2.exceptions.UndefinedError: ''convert_date_to_name'' 未定义
我有一个 Flask Web 应用程序,我在我的 PC 上对其进行了本地测试。在本地,一切正常 - 没有问题。所以,我已经将我的 Flask 应用程序部署在 uWsgi 和 Nginx 后面的 Ubuntu 20.04 服务器上。我现在面临的问题是,我的 Jinja2 模板自定义过滤器是“未定义”。我完全不确定问题出在哪里。
我得到的错误是:
ERROR:reservationsystem:Exception on / [GET]
Traceback (most recent call last):
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/app.py",line 2070,in wsgi_app
response = self.full_dispatch_request()
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/app.py",line 1515,in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/app.py",line 1513,in full_dispatch_request
rv = self.dispatch_request()
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/app.py",line 1499,in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask_monitoringdashboard/core/measurement.py",line 127,in wrapper
raise raised_exception
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask_monitoringdashboard/core/measurement.py",line 107,in evaluate
result = route_handler(*args,**kwargs)
File "./reservationsystem.py",line 216,in index
return render_template(''index.html'',treningy=treningy)
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/templating.py",line 147,in render_template
return _render(
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/flask/templating.py",line 128,in _render
rv = template.render(context)
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/jinja2/environment.py",line 1304,in render
self.environment.handle_exception()
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/jinja2/environment.py",line 925,in handle_exception
raise rewrite_traceback_stack(source=source)
File "/home/antonio/reservationsystem/templates/index.html",line 60,in top-level template code
<h3 id="h3forFading">{{ convert_date_to_name(complete_date)[0]|upper }}{{ convert_date_to_name(complete_date)[1:] }}
File "/home/antonio/reservationsystem/reservationsystem_venv/lib/python3.8/site-packages/jinja2/utils.py",line 84,in from_obj
if hasattr(obj,"jinja_pass_arg"):
jinja2.exceptions.UndefinedError: ''convert_date_to_name'' is undefined
这是我定义自定义过滤器的 Python Flask 代码片段:
#Convert date to name function for displaying it in Jinja2 template
def convert_date_to_name(date,format=r''%d-%m-%Y''):
date = str(date)
return datetime.datetime.strptime(date,format).strftime(''%A'')
...
# here are my routes (app.route()) defined
...
#Run Flask instance
if __name__ == "__main__":
app.jinja_env.globals[''convert_date_to_name''] = convert_date_to_name
app.jinja_env.add_extension(''jinja2.ext.loopcontrols'')
app.jinja_env.filters[''regex_replace''] = regex_replace
app.run(host=''0.0.0.0'',debug=False,threaded=True)
这是我使用自定义过滤器的 Jinja2 模板:
<h3 id="h3forFading">
{{ convert_date_to_name(complete_date)[0]|upper }}{{ convert_date_to_name(complete_date)[1:] }}
</h3>
我的 Flask 文件 + 虚拟环境所在目录的位置是:
# Flask files
/home/antonio/reservationsystem
#Virtual environment
/home/antonio/reservationsystem/reservationsystem_venv/
/home/antonio/reservationsystem
的结构如下所示:
antonio@addictionclubrezervacnysystemserver:~/reservationsystem$ ls -l
total 516
-rw-rw-r-- 1 antonio antonio 884 Jun 2 19:35 README.md
drwxr-xr-x 2 antonio www-data 4096 Jun 3 10:09 __pycache__
-rw-r--r-- 1 antonio antonio 57344 Jun 3 10:06 db_reservationsystem.db
-rw-r--r-- 1 antonio antonio 61440 Jun 3 10:42 flask_monitoringdashboard.db
-rw-rw-r-- 1 antonio antonio 18649 Jun 2 19:35 helpers.py
-rw-rw-r-- 1 antonio antonio 40 Jun 2 19:35 requirements.txt
-rw-rw-r-- 1 antonio antonio 163 Jun 2 19:43 reservationsystem.ini
-rw-rw-r-- 1 antonio antonio 119336 Jun 3 10:09 reservationsystem.py
srw-rw---- 1 antonio www-data 0 Jun 3 10:24 reservationsystem.sock
drwxrwxr-x 6 antonio antonio 4096 Jun 2 19:39 reservationsystem_venv
drwxrwxr-x 2 antonio antonio 4096 Jun 2 19:56 scripts
-rw-rw-r-- 1 antonio antonio 1311 Jun 2 19:35 start_everything.py
drwxrwxr-x 4 antonio antonio 4096 Jun 2 19:35 static
drwxrwxr-x 4 antonio antonio 4096 Jun 2 19:35 templates
-rw-rw-r-- 1 antonio antonio 76 Jun 2 19:41 wsgi.py
antonio@addictionclubrezervacnysystemserver:~/reservationsystem$
我用于 uWsgi 和 Nginx 的 .ini 文件如下所示:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = reservationsystem.sock
chmod-socket = 660
vacuum = true
die-on-term = true
enable-threads = true
我的 wsgi.py 文件如下所示:
from reservationsystem import app
if __name__ == "__main__":
app.run()
我的服务定义如下所示:
[Unit]
Description=uWsgi instance to serve Flask web app
After=network.target
[Service]
User=antonio
Group=www-data
WorkingDirectory=/home/antonio/reservationsystem/
Environment="PATH=/home/antonio/reservationsystem/reservationsystem_venv/bin"
ExecStart=/home/antonio/reservationsystem/reservationsystem_venv/bin/uwsgi --ini reservationsystem.ini
[Install]
WantedBy=multi-user.target
最后,我的 Nginx 配置如下所示:
server {
server_name mydomain.com www.mydomain.com;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/antonio/reservationsystem/reservationsystem.sock;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/trening.addictionclub.sk/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/trening.addictionclub.sk/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-Nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = mydomain.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name mydomain.com www.mydomain.com;
return 404; # managed by Certbot
}
对我来说,我的 Flask 网络应用程序的服务似乎在不同的文件夹中运行,然后我的模板无法将 convert_date_to_name()
函数导入 Jinja2 模板本身(尽管我不确定这是真的是这里的问题。这只是我有根据的猜测。)
非常感谢任何想法和帮助。
谢谢。
解决方法
问题出在 wsgi.py
from reservationsystem import app
if __name__ == "__main__":
app.run()
它在没有初始化的情况下启动应用程序。 if __name__ == "__main__":
下的代码
没有被执行,
可能您应该使用工厂模式来创建应用程序并在该 create_app() 方法中初始化 jinja。
https://flask.palletsprojects.com/en/2.0.x/patterns/appfactories/
或者你可以更新你的文件并在顶层初始化 jinja
from flask import Flask
app = Flask(__name__)
app.jinja_env.globals[''convert_date_to_name''] = convert_date_to_name
app.jinja_env.add_extension(''jinja2.ext.loopcontrols'')
app.jinja_env.filters[''regex_replace''] = regex_replace
#Convert date to name function for displaying it in Jinja2 template
def convert_date_to_name(date,format=r''%d-%m-%Y''):
date = str(date)
return datetime.datetime.strptime(date,format).strftime(''%A'')
...
# here are my routes (app.route()) defined
...
#Run Flask instance
if __name__ == "__main__":
app.run(host=''0.0.0.0'',debug=False,threaded=True)
jinja2 如何检索变量的值以在 if 语句中使用它 jinja2
如何解决jinja2 如何检索变量的值以在 if 语句中使用它 jinja2
为了通过mkdocs使用jinja和markdown创建模板。到目前为止,我遇到了这个阻碍我的问题。
我在 if 语句中使用了一个变量,以便在条件为真时用一些特定信息填充表格
假设我对 env1 和 env2 有不同的环境(env1 env2 env3),表的填充不需要 if 语句为真,但是当涉及到 env3 时,条件必须为真,因此填充表可能会出现。
我的模板是这样的
#{{env}}
##servers
{% if {{env}} = ''env3'' %}
| | IP | FQDN |
|-------------|----|------|
| | | |
{% for node in server.nodes %}|{{node.id}}|{{node.ip}}|{{node.fqdn}}|
{% endfor %} {% for node in server.class.nodes %}|classe{{node.id}}|{{node.ip}}|{{node.fqdn}}|
{% endfor %}
{% else %}
| | IP | FQDN |
|-------------|----|------|
| servertype1 | {{server.servertype1.ip}} | |
| servertype2 | {{server.servertype2.vip}} | |
{% for node in server.specific.nodes %}|specific{{node.id}}|{{node.ip}}|{{node.fqdn}}|
{% endfor %} {% for node in server.class.nodes %}|classe{{node.id}}|{{node.ip}}|{{node.fqdn}}|
{% endfor %}
{% endif %}
要继续,我很难检索 {{env}}
的值(标题中的值,因为 mkdocs 正确生成了它)以便在 if 语句中使用它,因此当涉及到特定页面时env3 的表格显示了适当的信息。
这是我得到的错误:
jinja2.exceptions.TemplateSyntaxError: 预期标记 '':'',得到 ''}''
我尝试了许多不同的语法变体,但结果保持不变。
我欢迎所有线索或提示以解决此问题。
解决方法
嗯,我找到了!
我只需要调整我的 if 语句语法而不是
{% if {{env}} = ''env3'' %}
我不得不这样写:
{% if env == "env3" %}
缺少等号和引号而不是 '' '' 加上 env 中的括号,我不得不删除它们
Jinja2:使用 jinja2
如何解决Jinja2:使用 jinja2
我在 markdown 文件中使用 jinj2 通过 Mkdocs 创建文档模板。
整个过程是通过管道创建的,所以我可以看到我在模板中编写的 jinja2 代码做了什么,但是现在有一个特殊问题阻碍了我:
假设我有 template1.md 和 template2.md 以及一个名为 file2.yml 的 var 文件
file2.yml 中的变量是包含在 template2.yml 中的汽车,其内容类似于:
squads:
- name: squad_name
mail: squad@mail.com
env_responsiblity: test
在 template2.md 和 jinja2 命令处理之后,字段被正确填充,所以到目前为止一切正常。
我想要的是像这样在我的第二个 template1.md 中调用 env_responsibility 值:
{% import ''template2.md'' as t %}
#{{environement}}
##Responsibility
{% if environement = t.env_responsibility %}
The environement {{environement}} is under the responsability of the {{t.squad.name}}
{% endif }%
可以肯定的是,小队名称和 env_responsibility 的调用不起作用,但我没有错误可以指出哪里出了问题。
有人可以帮忙突出这个问题吗?
解决方法
无法导入插入到模板中的变量,因为这些变量仅在渲染模板时可用,之后不会保存在上下文中。可以从一个模板导入到另一个模板的变量是用 jinja 编写的变量。例如
模板_1
{{ rendered_variable }}
{% set jinja_variable = "Something" %}
模板_2
{% import "template_1" as t %}
This does not work: {{ t.rendered_variable }}
This works: {{ t.jinja_variable }}
您需要为第二个模板提供第一个模板中所需的值,如果在渲染前不知道它们的值,则无法绕过它。
,如果您需要在第二个模板中使用第一个模板的上下文,您可以尝试包含而不是导入。
https://jinja.palletsprojects.com/en/2.11.x/templates/#import-visibility
另一方面,在渲染亚历山大已经说过的任何内容之前,您似乎可以尝试将 yml
的内容放入渲染上下文中。这样,您就可以在所有模板中使用数据。
关于python+jinja2 实现接口数据批量生成工具和python自动生成接口文档的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于AWS Lambda Python Jinja2 模板从 S3 加载 json、Flask 和 Jinja2 - 过滤器是 jinja2.exceptions.UndefinedError: 'convert_date_to_name' 未定义、jinja2 如何检索变量的值以在 if 语句中使用它 jinja2、Jinja2:使用 jinja2等相关内容,可以在本站寻找。
本文标签: