小编Phi*_*ord的帖子

在 Ansible 中,基于变量在循环中仅运行一项

在我的 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)

这应该可行,但必须将其添加到每个任务中似乎很费力且容易出错。有没有更优雅的方式来避免如此多的重复?

ansible

4
推荐指数
1
解决办法
5932
查看次数

为什么我在 Heroku 上使用 CloudAMQP 有这么多 Celery 消息?

我在 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 概览图往往如下所示:

RabbitMQ 概述

我对 …

django heroku rabbitmq celery cloudamqp

4
推荐指数
1
解决办法
537
查看次数

将路径重定向到 Rails 路由中的新域

我想将对一个站点上目录中的一堆文件/文件夹的请求重定向到新站点上的目录(然后是相同的路径)。

在我的 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]+)?/}在末尾添加类似内容以确保路径模糊有效,但我在尝试解决此问题时已将其忽略。)

ruby redirect routing ruby-on-rails

3
推荐指数
1
解决办法
1187
查看次数

如何显示Parsley.js找到的验证错误?

我正在使用Parsley.js来验证此示例中的部分表单.但是,即使表单应该验证,该validate()方法false也会返回.

没有显示错误消息,我想看看验证失败的原因是什么.

我找不到让Parsley简单地返回找到的所有错误的方法,所以我可以在控制台中看到它们.我错过了一些明显的事吗?

javascript validation parsley.js

3
推荐指数
2
解决办法
5738
查看次数

Python的mock.patch没有在unittest中修补类

我在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修补?

python mocking

3
推荐指数
1
解决办法
700
查看次数

在Ansible中使用pyenv

我正在使用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)

vagrant ansible pyenv

3
推荐指数
1
解决办法
3389
查看次数

使用Python请求和响应模拟下载文件

我有一些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:我正在测试的代码是这样的: …

python unit-testing python-requests

3
推荐指数
2
解决办法
2805
查看次数

创建自定义 Wagtail OEmbedFinder

我按照文档和此示例在我的 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 嵌入位于已发布的页面中。据我所知,我的 …

wagtail

3
推荐指数
1
解决办法
508
查看次数

如何在 Visual Studio Code 中使用 vim 模式切换多行注释

我在 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)

但是,使用该序列,虽然我可以选择一行来打开/关闭注释,但当我选择多行时,它不会执行任何操作。为什么?

visual-studio-code

3
推荐指数
1
解决办法
7632
查看次数

当使用 Django 的默认存储时,您应该/可以 close() 打开的文件吗?

使用 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()等效的内容。

所以我的问题是:

  1. 是否应该关闭使用 Django 默认存储打开的文件?
  2. 如果是这样,怎么办?
  3. 如果没有,为什么没有必要?

django

3
推荐指数
1
解决办法
5020
查看次数