我有一个Dockerfile,我正在整理它来安装一个vanilla python环境(我将在其中安装一个应用程序,但在以后).
FROM ubuntu:12.04
# required to build certain python libraries
RUN apt-get install python-dev -y
# install pip - canonical installation instructions from pip-installer.org
# http://www.pip-installer.org/en/latest/installing.html
ADD https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py /tmp/ez_setup.py
ADD https://raw.github.com/pypa/pip/master/contrib/get-pip.py /tmp/get-pip.py
RUN python /tmp/ez_setup.py
RUN python /tmp/get-pip.py
RUN pip install --upgrade pip
# install and configure virtualenv
RUN pip install virtualenv
RUN pip install virtualenvwrapper
ENV WORKON_HOME ~/.virtualenvs
RUN mkdir -p $WORKON_HOME
RUN source /usr/local/bin/virtualenvwrapper.sh
Run Code Online (Sandbox Code Playgroud)
构建运行正常,直到最后一行,我得到以下异常:
[previous steps 1-9 removed for clarity]
...
Successfully installed virtualenvwrapper virtualenv-clone stevedore …
Run Code Online (Sandbox Code Playgroud) 我想使用装饰器来处理各种函数的审计(主要是Django视图函数,但不是唯一的).为了做到这一点,我希望能够审计执行后的函数- 即函数正常运行,如果它返回没有异常,那么装饰器记录事实.
就像是:
@audit_action(action='did something')
def do_something(*args, **kwargs):
if args[0] == 'foo':
return 'bar'
else:
return 'baz'
Run Code Online (Sandbox Code Playgroud)
当audit_action
该功能完成后,将只运行.
我正在使用Sentry(在django项目中),我想知道如何正确地聚合错误.我将某些用户操作记录为错误,因此没有潜在的系统异常,并且使用该culprit
属性设置友好的错误名称.该消息是模板化的,并且包含一条公共消息("用户'x'因为'y'而无法执行操作"),但从不完全相同(不同的用户,不同的条件).
Sentry明确地使用一些属性来确定是否将错误聚合为同一个异常,但是尽管已经查看了代码,但我无法弄清楚如何.
任何人都可以简化我不得不深入挖掘代码并告诉我需要设置哪些属性来管理聚合,我想要?
[更新1:事件分组]
此行显示在sentry.models.Group中:
class Group(MessageBase):
"""
Aggregated message which summarizes a set of Events.
"""
...
class Meta:
unique_together = (('project', 'logger', 'culprit', 'checksum'),)
...
Run Code Online (Sandbox Code Playgroud)
这是有道理的 - 项目,记录器和罪魁祸首我现在正在设置 - 问题是checksum
.我将进一步调查,但是"校验和"表明二进制等价,它永远不会起作用 - 必须可以使用不同的属性对同一异常的实例进行分组?
[更新2:事件校验和]
事件校验和来自sentry.manager.get_checksum_from_event
方法:
def get_checksum_from_event(event):
for interface in event.interfaces.itervalues():
result = interface.get_hash()
if result:
hash = hashlib.md5()
for r in result:
hash.update(to_string(r))
return hash.hexdigest()
return hashlib.md5(to_string(event.message)).hexdigest()
Run Code Online (Sandbox Code Playgroud)
下一站 - 活动interfaces
来自哪里?
[更新3:事件接口]
我已经知道接口是指用于描述传递到哨兵事件的数据的标准机制,并且我正在使用标准sentry.interfaces.Message
和sentry.interfaces.User
接口.
根据异常实例,这两个数据都将包含不同的数据 - …
我使用以下Dockerfile创建了一个docker容器(截断):
FROM ubuntu:12.04
# curl enables downloading of other things
RUN apt-get install curl -y
# download and install rvm...
RUN \curl -L https://get.rvm.io | bash -s stable
# ... so that we can install ruby
RUN /bin/bash -l -c "rvm requirements"
Run Code Online (Sandbox Code Playgroud)
等等.
这一切都有效,但我遇到的问题是如何/在何处安装软件包.
如果我只是运行rvm docker run [...] rvm
我得到"无法找到rvm",但如果我运行docker run [...] /bin/bash -l -c "rvm"
它的工作原理.(我在网上找到了"-l -c"选项,但不知道他们做了什么,也无法找到我正在做的令人满意的解释!)
这不是一个码头问题 - 这是一个bash/*nix问题 - 我假设有一些关于如何/在哪里安装的东西,可能与在root下运行安装有关?
需要明确的是 - 我希望能够直接从CLI运行我安装的东西.
编辑1
安装Ruby使用RVM是推荐的方法,但是如果你想运行在非交互式,非登陆shell的东西(即泊坞窗的容器内),这只是导致与路径和环境变量和登录脚本不运行太多的麻烦.
鉴于我正在使用它来运行一个docker容器,根据定义它是可隔离的,并且可以恢复(只是构建另一个),我真的不关心切换版本,还是隔离包,所以我决定安装Ruby来自包裹仓库(http://brightbox.com/docs/ruby/ubuntu/).这'只是有效'.
它可能不适合你 - 我只是安装Ruby以获得Foreman gem,因为我正在通过Procfile运行应用程序,所以我不是对细节感到困惑,我只是需要它才能工作.如果你正在构建一个Ruby应用程序,我不会听从我的建议.
我的Dockerfile在这里,FWIW,https: //index.docker.io/u/yunojuno/dev/
我有一个部署到Heroku的应用程序,我希望能够在目标环境中部署后运行测试套件.我正在使用Heroku Postgres附加组件,这意味着我只能访问单个数据库.我无权创建新数据库,这反过来意味着标准的Django测试命令失败,因为它无法创建test_*数据库.
$ heroku run python manage.py test
Running `python manage.py test` attached to terminal... up, run.9362
Creating test database for alias 'default'...
Got an error creating the test database: permission denied to create database
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?
如果我从一个模块函数发送一个信号(发生了一个django视图函数),那不在一个类中,那么(对我而言)发送者应该是什么 - 如果有的话 - 并不明显?sender=None
在这种情况下是否合适?
或者,该函数由HTTP请求调用,我当前作为单独的参数传入 - 我应该通过它吗?
选项A:
from django.dispatch import Signal
my_signal = Signal(
providing_args=['my_arg', 'request']
)
# this is a view function
def do_something(request):
# ... do useful stuff
my_signal.send(
sender=None,
my_arg="Hello",
request=request
)
Run Code Online (Sandbox Code Playgroud)
选项B:
from django.dispatch import Signal
my_signal = Signal(
providing_args=['my_arg']
)
# this is a view function
def do_something(request):
# ... do useful stuff
my_signal.send(
sender=request,
my_arg="Hello",
)
Run Code Online (Sandbox Code Playgroud)
[UPDATE]
选项A有它.在这种情况下,接收者可以对发送者做任何有用的事情(即它不是对象),因此将其设置为None.
我将一个响应POST请求的API放在一起,方法是将新资源的内容放在响应主体中,并将新资源的URL放在Location HTTP响应头中.
样品申请:
POST /api/v1/widgets HTTP/1.1
Content-type: application/json;
Accept: application/json;
{
"name": "hugo@example.com",
"price": "10",
}
Run Code Online (Sandbox Code Playgroud)
样品回复:
HTTP 201 Created
Location: http://example.com/api/v1/widgets/123456
{
'widget':
{
'id': "123456",
'created': "2012-06-22T12:43:37+0100",
'name': "hugo@example.com",
'price': "10",
},
}
Run Code Online (Sandbox Code Playgroud)
有人提出了一个问题,即URL也应该在响应的正文中.这是最好的做法吗?
我切换当前使用的一个项目pipenv
,以poetry
作为一个测试,看看差别是什么。该项目是一个简单的、可再分发的 Django 应用程序。它支持 Python 3.6-8,以及 Django 2.2 和 3.0。我有一个tox.ini
文件,涵盖了 Python 和 Django 的所有组合,因此:
[tox]
envlist = py{36,37,38}-django{22,30}
[testenv]
whitelist_externals = poetry
skip_install = true
deps =
django22: Django==2.2
django30: Django==3.0
commands =
poetry install -vvv
poetry run pytest --cov=my_app tests/
poetry run coverage report -m
Run Code Online (Sandbox Code Playgroud)
我遇到的问题(pipenv
世界上不存在)是该poetry install
语句将始终用文件中的任何内容覆盖该deps
部分中的任何内容poetry.lock
(如果它不存在,它将自动生成)。这意味着测试矩阵永远不会针对 Django 2.2 进行测试 - 因为默认情况下每个 tox virtualenv 都会安装 Django 3.0。
我不明白这应该如何工作 - 是否应该使用poetry
尊重正在安装的现有环境来安装依赖项?
所以 - 我的问题是 - …
我有一个shell配置脚本,它调用一个需要用户输入的命令 - 但是当我运行时vagrant provision
,该过程在脚本中的那一点挂起,因为命令正在等待我的输入,但没有任何地方可以提供它.有没有办法解决这个问题 - 即强制脚本以某种交互模式运行?
具体是我创建一个干净的Ubuntu VM,然后调用Heroku CLI来下载数据库备份(这在我的配置脚本中):
curl -o /tmp/db.backup `heroku pgbackups:url -a myapp`
Run Code Online (Sandbox Code Playgroud)
但是,因为这是一个干净的VM,因此这是我第一次运行Heroku CLI命令,系统会提示我输入登录凭据.因为脚本是由Vagrant管理的,所以没有附加交互式shell,因此脚本就会挂起.
我有一个django模型类,它将状态维护为一个简单的属性.我已经在类中添加了几个辅助属性来访问聚合状态 - 例如,is_live
如果状态是任何一个状态,则返回false ['closed', 'expired', 'deleted']
.
因此,我的模型有一个is_属性集合,可以对对象的内部属性进行非常简单的查找.
我现在想要添加一个新属性is_complete
- 在语义上与所有其他属性相同 - 对对象状态进行布尔检查 - 但是,此检查涉及加载依赖(一对多)子对象,检查他们的状态并根据结果报告 - 即此属性实际上执行一些(多个)数据库查询,并处理结果.
那么,模型作为属性(使用@property
装饰器)仍然有效,或者我应该放弃装饰器并将其作为方法保留?
使用属性的专业是它在语义上与所有其他is_
属性一致.
使用方法的专业是它向其他开发人员表明这是具有更复杂实现的东西,因此应该谨慎使用(即不在for..
循环内).
from django.db import models
class MyModel(models.Model):
state = CharField(default='new')
@property
def is_open(self):
# this is a simple lookup, so makes sense as a property
return self.state in ['new', 'open', 'sent']
def is_complete(self):
# this is a complex database activity, but semantically correct
related_objects = self.do_complicated_database_lookup()
return len(related_objects)==0
Run Code Online (Sandbox Code Playgroud)
编辑:我最初来自.NET背景,其中杰夫阿特伍德的分裂是令人钦佩的
"如果有任何机会可以产生沙漏,那肯定应该是一种方法."
编辑2:对问题的轻微更新 - …