对于给定的Django应用程序,测试运行器在两个位置查找doctests:
该
models.py文件.您可以为单个模型定义模块级doctests和/或doctest.通常的做法是将应用程序级doctests放在模型docstring中的模块docstring和模型级doctests中.
tests.py在应用程序目录中调用的文件- 即包含models.py的目录.此文件是您要编写的任何和所有doctest的钩子,它们不一定与模型相关.
出于好奇,我想知道为什么Django的testrunner仅限于doctests models.py,但更实际上我想知道如何views.py在运行时扩展testrunner的doctests包括(例如)和其他模块manage.py test.
我很感激任何意见.
谢谢.
布赖恩
在与各种Web服务进行通信的Django项目上运行Python,我们遇到一个问题,偶尔请求大约需要5秒而不是通常的<100毫秒.
我把这个缩小到了socket.getaddrinfo函数的时间- requests当我们连接到外部服务时调用它,但它似乎也影响了集群中Postgres数据库框的默认Django连接.当我们uwsgi在部署后重新启动时,第一个进入的请求将花费5秒钟来发送响应.我也相信我们的芹菜任务定期需要5秒,但我还没有添加statsd计时器跟踪.
我写了一些代码来重现这个问题:
import socket
import timeit
def single_dns_lookup():
start = timeit.default_timer()
socket.getaddrinfo('stackoverflow.com', 443)
end = timeit.default_timer()
return int(end - start)
timings = {}
for _ in range(0, 10000):
time = single_dns_lookup()
try:
timings[time] += 1
except KeyError:
timings[time] = 1
print timings
Run Code Online (Sandbox Code Playgroud)
典型的结果是 {0: 9921, 5: 79}
我的同事已经指出了围绕ipv6查找时间的潜在问题,并将其添加到/etc/gai.conf:
precedence ::ffff:0:0/96 100
Run Code Online (Sandbox Code Playgroud)
这肯定改进了curl我们使用的非Python程序的查找,但不是来自Python本身.服务器盒正在运行Ubuntu 16.04.3 LTS,我可以在Python 2的vanilla虚拟机上重现这一点.
我可以采取哪些步骤来提高所有Python查找的性能,使它们可以<1s?
我们有一个Angular(v4)应用程序,该应用程序根据API接收到的JSON数据和文件存储中的图像生成表单。每个使用该应用程序的客户端都有(数百种)包含不同数据和图像的表单。请求了一项功能,该功能将允许客户端将其表单导出为zip中的PDF。
我们正在为该解决方案探索的策略是,当接收到客户端的导出请求时,服务器将加载客户端可以在无头浏览器中访问的每个表单,Angular将构建该表单,然后服务器将要求浏览器执行以下操作:生成PDF屏幕截图。然后将这些PDF压缩并通过电子邮件或下载链接发送给客户端。
我们遇到的问题是,无法从服务器端生成Angular应用的屏幕截图。
作为一个更简单的测试站点,我们也一直试图使这些工具中的任何一个都可以与当前的Angular文档站点-https: //angular.io/guide/quickstart一起使用。到目前为止,所有尝试都失败了:
wkhtmltopdf-获取我们正在加载的用户信息微调框,但即使等待90秒也没有内容到达。我们在JS输出中得到错误。
这是我们一直用来捕捉Angular docs网站的命令,该网站仅生成白色PDF:
~/render/wkhtmltox/bin$ ./wkhtmltopdf --debug-javascript --no-stop-slow-scripts --javascript-delay 90000 https://angular.io/guide/quickstart angular_quickstart.pdf
Loading pages (1/6)
Warning: undefined:0 TypeError: setting a property that has only a getter
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
Run Code Online (Sandbox Code Playgroud)PhantomJS-似乎比wkhtmltopdf可以进入“正在加载内容”微调器的功能要好一些,这意味着该应用程序知道它已登录的用户。但是,即使在等待和轮询DOM更改时,初始设置之后我们也没有任何更改加载。
当使用Angular docs网站时,这也会失败并显示白屏:
~/render/phantomjs-2.1.1-linux-x86_64$ bin/phantomjs examples/rasterize.js https://angular.io/guide/quickstart angular_quickstart.pdf
ReferenceError: Can't find variable: WeakMap
https://angular.io/main.f0610805f4aad19da4be.bundle.js:1 in cDNt
https://angular.io/inline.2826385ad3e299c6d1c1.bundle.js:1 in n
https://angular.io/main.f0610805f4aad19da4be.bundle.js:1
https://angular.io/inline.2826385ad3e299c6d1c1.bundle.js:1 in n
https://angular.io/inline.2826385ad3e299c6d1c1.bundle.js:1 in webpackJsonp
Run Code Online (Sandbox Code Playgroud)Puppeteer-我们尚未完全探究无头的Chrome,但是使用https://try-puppeteer.appspot.com/和Angular docs网站进行的初始测试因以下原因而失败:
Error …Run Code Online (Sandbox Code Playgroud)对于嵌套注释系统,我使用Comment模型中的以下定义将树结构存储在PostgreSQL表中:
path = sa.Column(ARRAY(sa.Integer))
Run Code Online (Sandbox Code Playgroud)
这会将注释的所有ID存储在当前注释的路径中.因此,如果id15 的评论是11和13的孩子,那么它的路径就是[11,13,15].
现在我想找到并计算孩子的评论.所以为了找到评论11的所有孩子,包括我自己,我想生成如下的SQL:
SELECT id, path FROM comments WHERE path[1] = 11;
Run Code Online (Sandbox Code Playgroud)
在我的数据库中,这很快就会返回一组很好的注释11及其子代.
通过上面的例子,如果我想抓住评论的孩子,我可以使用以下SQL:
SELECT id, path FROM comments WHERE path[1] = 11 AND path[2] = 13;
Run Code Online (Sandbox Code Playgroud)
如何使用SQLAlchemy生成此SQL?
我已经乱砍了filter_by(),filter()但没有取得多大成功......这些都不起作用:
q = Comment.query.filter(path[1] == 11)
> NameError: name 'path' is not defined
q = Comment.query.filter_by(path[1] = 11)
> SyntaxError: keyword can't be an expression
Run Code Online (Sandbox Code Playgroud)
我不想为这个查询编写自定义SQL,但如果这是唯一的方法,那么请给出一些关于如何最佳构造的指示.
编辑1
确认我正在使用SQLAlchemy 0.7 - 所以使用此版本工作(周围)的答案会更有帮助.
我意识到,对于上面的评论实现,没有必要在确切的位置找到id号,在任何位置找到它们也可以工作.所以关于如何创建SQLAlchemy来生成这样的东西的任何输入都会很好:
SELECT id, path FROM comments WHERE …Run Code Online (Sandbox Code Playgroud) 鉴于我正在编写代码的 OpenAPI 规范要求在请求正文中使用连字符大小写(又名 kebab-case)变量名称,在使用 Django Rest Framework 时应该如何处理?
例如,POST /thing创建事物的请求具有以下主体:
{
"owner-type": "platform"
}
Run Code Online (Sandbox Code Playgroud)
但是在Python,owner-type不是有效的变量名(“语法错误:无法分配给经营者”),这样反而Thing有owner_type在模型中定义:
{
"owner-type": "platform"
}
Run Code Online (Sandbox Code Playgroud)
但现在ThingSerializer有问题,因为再次owner-type是一个非法名称。这是不允许的:
class Thing(models.Model):
owner_type = models.CharField(max_length=8)
Run Code Online (Sandbox Code Playgroud)
我试图ModelSerializer通过尝试调整由 生成的字段名称来覆盖名称的生成方式get_fields(),但它失败了。这是我的序列化程序:
owner-type = serializers.CharField(...)
Run Code Online (Sandbox Code Playgroud)
和错误:
../venv/lib/python3.6/site-packages/rest_framework/fields.py:453: in get_attribute
return get_attribute(instance, self.source_attrs)
../venv/lib/python3.6/site-packages/rest_framework/fields.py:101: in get_attribute
instance = getattr(instance, attr)
E AttributeError: 'Thing' object has no attribute 'owner-type'
Run Code Online (Sandbox Code Playgroud)
所以我的问题 - 如何配置 DRF 模型序列化器以允许包含下划线的模型字段被序列化/反序列化,以便 API 客户端看到连字符而不是下划线?这将是上面示例的通用解决方案,其中Thing.owner_type应该通过"owner-type"在 JSON …
我的模型中定义了3个url字段,如下所示:
image_1 = models.URLField(max_length=100, verify_exists=True, blank=True)
image_2 = models.URLField(max_length=100, verify_exists=True, blank=True)
image_3 = models.URLField(max_length=100, verify_exists=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法可以测试是否verify_exists返回True或者False如果是这样取决于输出?
在 Pyramid 中使用 URL Dispatch 并在路由定义中使用模式匹配,我想确保生成的 URLroute_path是有效的并匹配给定的路由 - 最好的方法是什么?
这是我的路线定义 - 我想要/numbers后跟一个等于 1 或更大的数字字符串......
config.add_route('numbers', 'numbers/{n:[1-9]\d*}/')
Run Code Online (Sandbox Code Playgroud)
然后当我在视图中生成一条路线时,这很好:
request.route_url('numbers', n=123)
Run Code Online (Sandbox Code Playgroud)
它返回/numbers/123/,这很好......
但是,如果我这样做...
request.route_url('numbers', n='chicken')
Run Code Online (Sandbox Code Playgroud)
Pyramid 返回/numbers/chicken/显然与模式不匹配并且在传递回应用程序时会给出 404。
有没有办法可以强制 Pyramid 在n生成路线时检查是否与给定模式匹配?这意味着我可以确定route_url并且route_path会提供可以在应用程序中使用的有效 URL。
python ×6
django ×3
angular ×1
dns ×1
doctest ×1
firebase ×1
pdf ×1
phantomjs ×1
postgresql ×1
puppeteer ×1
pyramid ×1
routes ×1
sockets ×1
sqlalchemy ×1
unit-testing ×1
wkhtmltopdf ×1