这是我在Flask-RESTful中进行单元测试的一部分.
self.app = application.app.test_client()
rv = self.app.get('api/v1.0/{0}'.format(ios_sync_timestamp))
eq_(rv.status_code,200)
Run Code Online (Sandbox Code Playgroud)
在命令行中,我可以使用curl将用户名:密码发送到服务:
curl -d username:password http://localhost:5000/api/v1.0/1234567
Run Code Online (Sandbox Code Playgroud)
如何在单元测试的get()中实现相同的功能?
由于我的get/put/post需要身份验证,否则测试将失败.
python unit-testing basic-authentication flask flask-restful
我有一个模型,图像存储为二进制blob.我想在模板中显示此图像以及有关该对象的其他数据.由于图像不是单独的文件,我无法弄清楚如何显示它.我已尝试设置标题,或使用send_file或render_template,但我要么不获取图像,要么只获取图像而不是模板的其余部分.如何在模板中将二进制blob显示为图像?
class A(ndb.Model):
id= ndb.IntegerProperty()
x= ndb.StringProperty()
y= ndb.StringProperty()
image = ndb.BlobProperty()
Run Code Online (Sandbox Code Playgroud) 我正在创建一个新的烧瓶应用程序使用flask-sqlalchemy和flask-restful with Python 3.4.我已经定义了我的用户模型:
from mytvpy import db
from sqlalchemy.ext.declarative import declared_attr
class BaseModel(db.Model):
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.TIMESTAMP, server_default=db.func.now())
last_updated = db.Column(db.TIMESTAMP, server_default=db.func.now(), onupdate=db.func.current_timestamp())
@declared_attr
def __tablename__(cls):
return cls.__name__
class User(BaseModel):
username = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
def __init__(self, username, password, email):
super(User, self).__init__()
self.username = username
self.password = password
self.email = email
Run Code Online (Sandbox Code Playgroud)
如果我尝试在ipython中查询,它可以工作:
In [15]: from mytvpy.models.base import User
In [16]: User.query.all()
Out[16]: [<mytvpy.models.base.User at 0x7fac65b1c6a0>]
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试从端点点击它:
class …Run Code Online (Sandbox Code Playgroud) 我正在研究烧瓶中的小休息api.Api具有注册请求并生成单独线程以在后台运行的路由.这是代码:
def dostuff(scriptname):
new_thread = threading.Thread(target=executescript,args=(scriptname,))
new_thread.start()
Run Code Online (Sandbox Code Playgroud)
线程启动但是当我尝试从executioncript函数插入db时它会出错.它抱怨db对象没有在应用程序中注册.
我正在动态创建我的应用程序(使用api作为Blueprint).
这是应用程序的结构
-run.py ## runner script
-config
-development.py
-prod.py
-app
-__init__.py
- auth.py
- api_v1
- __init__.py
- routes.py
- models.py
Run Code Online (Sandbox Code Playgroud)
这是我的跑步者脚本run.py:
from app import create_app, db
if __name__ == '__main__':
app = create_app(os.environ.get('FLASK_CONFIG', 'development'))
with app.app_context():
db.create_all()
app.run()
Run Code Online (Sandbox Code Playgroud)
以下是app/__init__.py创建应用程序的代码:
from flask import Flask, jsonify, g
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
"""Create an application instance."""
app = Flask(__name__)
# apply configuration
cfg = os.path.join(os.getcwd(), …Run Code Online (Sandbox Code Playgroud) 我想在Flask REST API中处理GET请求.请求将包含多个参数,您可以期望这是一个典型的GET请求: https:// localhost:5000/item/analysis = true&class = A&class = B
因此,GET请求包括:
我想在add_resource()中接受这个,如下所示:
add_resource(Item, '/item/<whatever-comes-here>')
我对如何在add_resource()中接受多个参数(其中一个是列表)一无所知.我如何在add_resource()函数中接受它们,如何在get()函数中解压缩它们?
我花时间对此进行逆向工程,但我还没有成功.难道我做错了什么?
(我知道可能有更好的方法来发送带有REST API GET请求的列表,所以我很感激任何有关它的指示!)真诚地感谢提前!
Flask 2.0 中介绍了 async/await 的用法。(https://flask.palletsprojects.com/en/2.0.x/async-await/)
我正在使用 Flask-RestX,那么是否可以在 RestX 请求处理程序中使用async/ ?await
就像是:
@api.route('/try-async')
class MyResource(Resource):
@api.expect(some_schema)
async def get(self):
result = await async_function()
return result
Run Code Online (Sandbox Code Playgroud)
不起作用,当我尝试到达此端点时,出现错误:
TypeError: Object of type coroutine is not JSON serializable
有这方面的信息吗?
封装版本:
flask==2.0.1
flask-restx==0.4.0
Run Code Online (Sandbox Code Playgroud)
我也flask[async]按照文档的建议安装了。
我正在使用普通烧瓶网+烧瓶 - 安静.所以我需要针对Web的CSRF保护,而不是REST.
那一刻我让CsrfProtect(app)的flask-wtf,我所有的职位单元测试flask-restful返回400.
有没有办法为REST服务禁用CSRF保护,因为它们来自移动手机,无论如何都没有会话处理,因此CSRF没有多大意义.
这是我测试它的方式:
rv = self.client.post('api/v1.0/verify-email', environ_base={'REMOTE_ADDR': '127.0.0.1'}, headers={'Content-Type':'application/json'}, data=json.dumps(data))
self.check_content_type(rv.headers)
eq_(rv.status_code, 412)
Run Code Online (Sandbox Code Playgroud) 全部,我正在尝试使用Flask-Restful,按照文档提出自定义错误.出于测试目的,我已经在文档中定义并注册了错误词典中的链接:api = flask_restful.Api(app, errors=errors).
但是,当我想abort(409)在资源模块中使用(例如)引发自定义错误时,firebug会报告:
{"message":"冲突","状态":409}
这似乎是标准的409错误,没有定制; 从文档中,我希望自定义错误消息 - "具有该用户名的用户已存在".
我想我错过了引发错误本身的一些事情.我应该以任何方式使用字典密钥吗?尽管我尝试过,但检查Flask-Restful源代码并没有帮助.
我已经在SO上阅读了几个相关的问题,但没有设法找到一个有效的解决方案.
我有一个带有这个简化代码的Flask服务器:
app = Flask(__name__)
api = Api(app)
class SendMailAPI(Resource):
def post(self):
print request.files
return Response(status=200)
api.add_resource(SendMailAPI, '/')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
Run Code Online (Sandbox Code Playgroud)
然后在客户端:
# coding:utf-8
import requests
eng_file_name = 'a.txt'
heb_file_name = u'?.txt'
requests.post('http://localhost:5000/', files={'file0': open(eng_file_name, 'rb')})
requests.post('http://localhost:5000/', files={'file0': open(heb_file_name, 'rb')})
Run Code Online (Sandbox Code Playgroud)
当发送带有非utf-8文件名的第一个请求时,服务器接收带有文件的请求并打印ImmutableMultiDict([('file0', <FileStorage: u'a.txt' (None)>)]),但是当发送带有utf-8文件名的文件时,服务器似乎在打印时没有收到该文件ImmutableMultiDict([]).
我正在使用请求,2.3.0但问题并没有解决最新版本(2.8.1),Flask版本0.10.1和Flask-RESTful版本0.3.4.
我已经完成了一些requests代码挖掘并且请求似乎已发送正常(即使用该文件),并且我在发送之前打印了请求,并且看到文件名确实编码为RFC2231:
--6ea257530b254861b71626f10a801726
Content-Disposition: form-data; name="file0"; filename*=utf-8''%D7%90.txt
Run Code Online (Sandbox Code Playgroud)
总结一下,我不完全确定问题是否在于requests没有正确地将文件附加到请求,或者是否Flask存在拾取具有根据RFC2231编码的文件名的文件的问题.
更新:在requestsGitHub中遇到过这个问题:https://github.com/kennethreitz/requests/issues/2505
我有一个烧瓶应用程序脚本,如下所示:
from flask import Flask
app = Flask(__name__)
@app.route("/<string:job_id>")
def main(job_id):
return "Welcome!. This is Flask Test Part 1"
if __name__ == "__main__":
job_id = 1234
app.run(host= '0.0.0.0')
Run Code Online (Sandbox Code Playgroud)
我有另一个烧瓶应用程序脚本如下:
from flask import Flask
app = Flask(__name__)
@app.route("/<string:ID>")
def main(ID):
return "Welcome!. This is Flask Test Part 2"
if __name__ == "__main__":
ID = 5678
app.run(host= '0.0.0.0')
Run Code Online (Sandbox Code Playgroud)
两个脚本之间的唯一区别是参数名称及其值.现在我的问题是假设我正在执行第一个脚本.所以我会得到类似的东西
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中执行http://127.0.0.1:5000/1234时,我能够看到
"欢迎!这是Flask Test Part 1"
现在这个服务器处于活动状态,我正在执行第二个脚本.所以我再次得到
* Running on http://0.0.0.0:5000/ (Press CTRL+C to …Run Code Online (Sandbox Code Playgroud) flask ×10
flask-restful ×10
python ×9
jinja2 ×1
python-3.x ×1
rest ×1
unicode ×1
unit-testing ×1