在我的 Ansible playbook 中,我在一台服务器上设置了多个网站。每个网站都在apps变量中设置了一些配置:
apps:
- name: 'app1'
git_repo: 'https://github.com/philgyford/app1.git'
- name: 'app2'
git_repo: 'https://github.com/philgyford/app2.git'
Run Code Online (Sandbox Code Playgroud)
然后为每个应用程序/站点循环运行某些任务:
- name: Set up git repos for apps
git:
repo: '{{ item.git_repo }}'
version: 'master'
dest: "/webapps/{{ item.name }}"
accept_hostkey: yes
with_items: apps
Run Code Online (Sandbox Code Playgroud)
这一切都很好。但理想情况下,我希望能够运行剧本并且只为特定应用程序运行这些任务。
一种方法是--extra-vars "app=app1"在命令行上传递。在剧本中,我为appof设置了默认值false。然后在每个与应用程序相关的任务上添加:
when: item.name == app or app == false
Run Code Online (Sandbox Code Playgroud)
这应该可行,但必须将其添加到每个任务中似乎很费力且容易出错。有没有更优雅的方式来避免如此多的重复?
我在 Heroku 上运行的 Django 站点使用 CloudAMQP 来处理其计划的 Celery 任务。CloudAMQP 注册的消息比我的任务多得多,我不明白为什么。
例如,在过去的几个小时里,我将运行大约 150 个计划任务(两个每分钟运行一次,另一个每五分钟运行一次),但是 CloudAMQP 控制台的消息计数增加了大约 1,300。
我的相关 Django 设置:
BROKER_URL = os.environ.get("CLOUDAMQP_URL", "")
BROKER_POOL_LIMIT = 1
BROKER_HEARTBEAT = None
BROKER_CONNECTION_TIMEOUT = 30
CELERY_ACCEPT_CONTENT = ['json',]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 7 * 86400
CELERY_SEND_EVENTS = False
CELERY_EVENT_QUEUE_EXPIRES = 60
CELERY_RESULT_BACKEND = None
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
Run Code Online (Sandbox Code Playgroud)
我的档案:
web: gunicorn myproject.wsgi --log-file -
main_worker: python manage.py celery worker --beat --without-gossip --without-mingle --without-heartbeat --loglevel=info
Run Code Online (Sandbox Code Playgroud)
查看 Heroku 日志,我只能看到我期望的正在运行的计划任务的数量。
大多数情况下,RabbitMQ 概览图往往如下所示:
我对 …
我想将对一个站点上目录中的一堆文件/文件夹的请求重定向到新站点上的目录(然后是相同的路径)。
在我的 Rails routes.rb 中,我有:
match '/uploads/*path', :to => redirect{|params, request| "http://othersite.com/uploads/#{params[:path]}"}
Run Code Online (Sandbox Code Playgroud)
我从这个答案中得到的。
它几乎可以工作,除了这个 URL:
http://currentsite.com/uploads/some/directories/filename.pdf
Run Code Online (Sandbox Code Playgroud)
重定向到:
http://othersite.com/uploads/some/directories/filename
Run Code Online (Sandbox Code Playgroud)
我不知道为什么缺少文件扩展名。
(我还会constraints: {:path => /[\w\-_\/]+(\.[a-z]+)?/}在末尾添加类似内容以确保路径模糊有效,但我在尝试解决此问题时已将其忽略。)
我正在使用Parsley.js来验证此示例中的部分表单.但是,即使表单应该验证,该validate()方法false也会返回.
没有显示错误消息,我想看看验证失败的原因是什么.
我找不到让Parsley简单地返回找到的所有错误的方法,所以我可以在控制台中看到它们.我错过了一些明显的事吗?
我在python单元测试中使用Mock感到困惑.我已经制作了我的问题的简化版本:
我有这个虚拟类和方法:
# app/project.py
class MyClass(object):
def method_a(self):
print FetcherA
results = FetcherA()
Run Code Online (Sandbox Code Playgroud)
哪个使用这个类:
# app/fetch.py
class FetcherA(object):
pass
Run Code Online (Sandbox Code Playgroud)
然后这个测试:
# app/tests/test.py
from mock import patch
from django.test import TestCase
from ..project import MyClass
class MyTestCase(TestCase):
@patch('app.fetch.FetcherA')
def test_method_a(self, test_class):
MyClass().method_a()
test_class.assert_called_once_with()
Run Code Online (Sandbox Code Playgroud)
我希望运行此测试将通过,并且该print语句,为了调试,将输出类似的东西<MagicMock name=...>.相反,它打印出来<class 'app.fetch.FetcherA'>,我得到:
AssertionError: Expected to be called once. Called 0 times.
Run Code Online (Sandbox Code Playgroud)
为什么不FetcherA修补?
我正在使用Ansible设置基于Ubuntu的Vagrant和DigitalOcean框,并希望使用pyenv来管理一些不同网站的环境。
尝试使用已安装的pyenv安装python版本时,权限出现问题,这可能是由于我缺乏基本的* nix知识。
我有一个deploy用户和组,我为之安装了pyenv,但显然,由于下面的最终任务失败,用户正在做的事情(为了清楚起见,所有变量都替换为字符串):
- name: Install pyenv
git:
repo: https://github.com/yyuu/pyenv.git
dest: "/home/deploy/.pyenv"
- name: Install pyenv-virtualenv plugin
git:
repo: https://github.com/yyuu/pyenv-virtualenv.git
dest: "/home/deploy/.pyenv/plugins/pyenv-virtualenv"
- name: Add path etc to .bashrc.
lineinfile:
dest: "/home/deploy/.bashrc"
state: present
create: yes
line: "{{ item }}"
with_items:
- 'export PYENV_ROOT="$HOME/.pyenv"'
- 'export PATH="$PYENV_ROOT/bin:$PATH"'
- 'eval "$(pyenv init -)"'
- 'eval "$(pyenv virtualenv-init -)"'
- name: Ensure .pyenv permissions are set properly
file: path=/home/deploy/.pyenv
recurse=yes
owner=deploy
group=deploy
state=directory
- name: Install default python version …Run Code Online (Sandbox Code Playgroud) 我有一些python代码,可以使用请求从URL成功下载图片,并将其保存到中/tmp/。我想测试一下它应该做什么。我正在使用响应来测试JSON文件的提取,但是我不确定如何模拟提取文件的行为。
我认为这类似于模拟标准响应,如下所示,但我认为我在如何将设置body为文件方面空白...
@responses.activate
def test_download():
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body='', status=200,
content_type='image/jpeg')
#...
Run Code Online (Sandbox Code Playgroud)
更新:在Ashafix的评论之后,我正在尝试这样做(python 3):
from io import BytesIO
@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
imgIO = BytesIO(img1.read())
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=imgIO, status=200,
content_type='image/jpeg')
imgIO.seek(0)
#...
Run Code Online (Sandbox Code Playgroud)
但是随后,当我正在测试的代码尝试执行我得到的请求时:
a bytes-like object is required, not '_io.BytesIO'
Run Code Online (Sandbox Code Playgroud)
感觉几乎是正确的,但是我很沮丧。
更新2:试图遵循史蒂夫·杰索普的建议:
@responses.activate
def test_download():
with open('tests/images/tester.jpg', 'rb') as img1:
responses.add(responses.GET, 'http://example.org/images/my_image.jpg',
body=img1.read(), status=200,
content_type='image/jpeg')
#...
Run Code Online (Sandbox Code Playgroud)
但是这次被测试的代码提出了这一点:
I/O operation on closed file.
Run Code Online (Sandbox Code Playgroud)
确定图像仍应在with块内打开吗?
更新3:我正在测试的代码是这样的: …
我按照文档和此示例在我的 Wagtail 站点中创建自定义 OEmbed Finder。(最终我想修改 YouTube 视频的 HTML 输出以使用域youtube-nocookie.com,而不是youtube.com。)
我在以下位置创建了这个myapp.embeds.finders.oembed.py:
from wagtail.embeds.finders.oembed import OEmbedFinder
class YouTubeOEmbedFinder(OEmbedFinder):
def find_embed(self, url, max_width=None):
embed = super().find_embed(url, max_width)
# Just to see that it's doing something:
embed['html'] = '<p>Hello</p>'
return embed
Run Code Online (Sandbox Code Playgroud)
并在我的设置中添加了这个:
from wagtail.embeds.oembed_providers import youtube
WAGTAILEMBEDS_FINDERS = [
{
'class': 'myapp.embeds.finders.oembed.YouTubeOEmbedFinder',
'providers': [youtube],
},
{
# Handles all other oEmbed providers the default way
'class': 'wagtail.embeds.finders.oembed',
},
]
Run Code Online (Sandbox Code Playgroud)
但没有什么不同 - 标准的 YouTube 嵌入位于已发布的页面中。据我所知,我的 …
我在 Mac 上使用 VS Code,使用 Vim 模拟。
如果我有一个.py这样的文件:
test1 = 1
test2 = 2
Run Code Online (Sandbox Code Playgroud)
我选择所有三行,然后按<cmd>,/我得到:
# test1 = 1
# test2 = 2
Run Code Online (Sandbox Code Playgroud)
我想要使用 vim 命令序列<leader>, then c, then 来实现相同的功能<space>。
在我的settings.json我有这个:
{
"vim.leader": ",",
"vim.normalModeKeyBindings": [
{
"before": ["<leader>", "c", "<space>"],
"commands": ["editor.action.commentLine"],
"when": "editorTextFocus && !editorReadonly"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,使用该序列,虽然我可以选择一行来打开/关闭注释,但当我选择多行时,它不会执行任何操作。为什么?
使用 Django 时,DefaultStorage可以打开并读取如下文件:
from django.core.files.storage import default_storage
file = default_storage.open("dir/file.txt", mode="rb")
data = file.read()
Run Code Online (Sandbox Code Playgroud)
使用python自带的open()方法时,最好是close()事后文件,或者使用with open("dir/file.txt") as file:构造。
但是阅读Django 存储类的文档并浏览源代码,我没有看到close()等效的内容。
所以我的问题是:
ansible ×2
django ×2
python ×2
celery ×1
cloudamqp ×1
heroku ×1
javascript ×1
mocking ×1
parsley.js ×1
pyenv ×1
rabbitmq ×1
redirect ×1
routing ×1
ruby ×1
unit-testing ×1
vagrant ×1
validation ×1
wagtail ×1