所以,这个是一个很糟糕的.我正在采取一种解决方法,但只是将其解决,以防有更好的解决方案.并且,在花了几个小时才弄明白之前,我也把它作为一个问题.
基本上,我想知道是否有巧妙的方法来避免对django.setup()的递归调用.
我有3或4个批处理脚本,我可以在独立模式或芹菜中运行.其中一个叫做build_profiles.py
celery查看它们(在其中一个tasks.py文件中)的方式:
from pssecurity.batch.build_profiles import \
ProfileManager as MgrCls_profiles, \
getOptParser as getOptParser_profiles
Run Code Online (Sandbox Code Playgroud)
在Django 1.6中,这种安排运行良好(我并不完全相信芹菜是推出潜在独立流程的最佳方式,但这是另一个故事).
当我尝试从命令行运行build_profiles.py时,它给出了AppRegistryNotReady错误.
没问题,我想,让我们将以下内容添加到build_profiles.py的顶部,按照https://docs.djangoproject.com/en/dev/ref/applications/#applications-troubleshooting
import django
django.setup()
Run Code Online (Sandbox Code Playgroud)
然后Django再没有任何工作了. 单元测试不会运行,manager.py runserver会挂起.如何改变独立批处理会使我的系统停止运行?
事实证明,django.setup()发现芹菜加载它的任务,如果其中一个最终做了自己的django.setup()...
我正在使用requests登录我的Django网站进行测试(是的,我知道Django TestClient,但我需要简单的http).我可以登录,只要我收到请求,一切都OK.
当我尝试使用post时,我从csrf中间件获得403.我现在通过在我的视图中使用@crsf_exempt来解决这个问题,但更喜欢长期解决方案.
这是我的代码:
with requests.Session() as ses:
try:
data = {
'username': self.username,
'password': self.password,
}
ses.get(login_url)
try:
csrftoken = ses.cookies["csrftoken"]
except Exception, e:
raise
data.update(csrfmiddlewaretoken=csrftoken)
_login_response = ses.post(login_url, data=data)
logger.info("ses.cookies:%s" % (ses.cookies))
assert 200 <= _login_response.status_code < 300, "_login_response.status_code:%s" % (_login_response.status_code)
response = ses.post(
full_url,
data=data,
)
return self._process_response(response)
Run Code Online (Sandbox Code Playgroud)
登录工作正常,我可以在这里看到csrf令牌.
INFO:tests.helper_fetch:ses.cookies:<RequestsCookieJar[<Cookie csrftoken=TmM97gnNHs4YCgQPzfNztrAWY3KcysAg for localhost.local/>, <Cookie sessionid=kj6wfmta
Run Code Online (Sandbox Code Playgroud)
但是,中间件将cookie视为空.
INFO:django.middleware.csrf:request.COOKIES:{}
Run Code Online (Sandbox Code Playgroud)
我已经将日志代码添加到它:
def process_view(self, request, callback, callback_args, callback_kwargs):
if getattr(request, 'csrf_processing_done', False):
return None
try: …Run Code Online (Sandbox Code Playgroud) 假设我有 2 个结果集(2 个查询)。
FIELDNAME VALUE
field1 20.00
field2 13.00
field3 4.00
FIELDNAME VALUE
field1 20.00
field2 14.00
field3 6.00
Run Code Online (Sandbox Code Playgroud)
我知道query1 EXCEPT query2应该给
FIELDNAME VALUE
field2 13.00
field3 4.00
Run Code Online (Sandbox Code Playgroud)
但我真正想要的是从查询的两侧显示任何存在差异的情况:
FIELDNAME VALUE
field2 13.00
field3 4.00
field2 14.00
field3 6.00
Run Code Online (Sandbox Code Playgroud)
那可能吗?我想我可以在临时表中执行 SELECT UNION 。然后删除具有不同值的 NOT EXISTS 字段名的任何行。有没有更简单的?
似乎我可以以某种方式组合 INTERSECT、UNION 和 EXCEPT 并最终得到这个,但没有太多运气概念化。
我的影片所造成的Vue一个组件内该故障代码_errors是undefined我data,至少在页面加载.
data: function () {
var temp = {
show_debug : false
,password_changed_flag : false
,_errors : this.$store.state.form01._errors || {}
}
var data = Object.assign({}, this.$store.state.form01.data, temp);
//this is the part I am struggling with:
console.log("data:");
console.dir(data);
return data;
},
Run Code Online (Sandbox Code Playgroud)
然而,这不是关于我做错了什么,而是关于如何轻松console.dir(data)Vue的反应对象.
即我如何打印出一个简单的嵌套对象,减去getter和setter?并及时拍摄该物体的快照.
ie _errors似乎现在存在,但我想只在data功能完成时显示对象的状态,而不是跟踪后续更改.
我目前在Firefox和Chrome中获得的是以下内容:
好吧,这绝对是我的错,但我需要清理它。我的一个测试脚本相当一致(但并不总是)以一种会给其他人带来问题的方式更新我的数据库(基本上,它剥夺了测试用户对测试数据库的访问权限)。
通过在每个单独的测试之后或每个测试脚本完成之后运行一个简单的查询,我可以很容易地找出是哪个脚本导致了这种情况。
即pytest, or nose2, 将执行以下操作:
run test_aaa.py
run check_db_access.py #ideal if I could induce a crash/abort
run test_bbb.py
run check_db_access.py
...
Run Code Online (Sandbox Code Playgroud)
你明白了。是否有我可以使用的内置选项或插件?测试套件目前适用于 pytest 和nose2,因此两者都是一个选项。
编辑:这不是一个测试数据库,也不是一个加载夹具的数据库。这是许多极其复杂的实时数据库中的任何一个的快照,并且测试套件,根据其设计,应该自省数据库并弄清楚如何运行其测试(几乎所有访问都是只读的) . 这很好用,并且至少在我的特定上下文中具有许多有益的方面,但这也意味着没有拆卸或夹具负载供我使用。
我有一个昂贵的函数,我想使用functools.lru_cache进行缓存,但仅限于某些运行时条件。
from functools import lru_cache
@lru_cache(maxsize=32)
def myfunc(a, b):
return a * b
print(myfunc(1,2))
print(myfunc(1,2))
print(myfunc(1,3))
print(f"cache_info:{myfunc.cache_info()}")
Run Code Online (Sandbox Code Playgroud)
2
2
3
cache_info:CacheInfo(hits=1, misses=2, maxsize=32, currsize=2)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试先声明该函数,然后有条件地将其包装在 中lru_cache,而不使用 @decorator 语法时,我遇到了问题。
from functools import lru_cache
def conditional_cached_func(a, b):
return a * b
some_system_dependent_value = True
if some_system_dependent_value:
cache_done = False
# I'm trying multiple calls to see what lru_cache expects
# only #3 works, but just so you don't replicate the other ones.
if …Run Code Online (Sandbox Code Playgroud) 我正在动态构建和执行一些 SQL,并希望以文本形式输出数据。
为此,我更愿意提供一个简洁的小柱状输出,这是您在 sql 实用程序中看到的典型输出。
col1 column2_has_a_really_long_name
_______________ ______________________________
has longer data 0.0
Run Code Online (Sandbox Code Playgroud)
因此,基本上,colwidth = max(len(colname), datasize))将告诉每列填充多少(使用动态生成的%(colname1)-20.20s类型的模板,其中 20 是 col1 的 datasize 方法)。
Python dbapi2 将此类信息存储在https://www.python.org/dev/peps/pep-0249/#description.
是否有一种简单的方法可以从sqlalchemy.engine.result.ResultMetaData实例或其他可从执行访问的对象获取cursor.description ?
通过指向预定义的提示-答案文件,是否有任何提供重播类型功能的东西?
举个例子,使用cookiecutter为pypi准备一个Python包
cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
You've downloaded /Users/jluc/.cookiecutters/cookiecutter-pypackage before. Is it okay to delete and re-download it? [yes]:
full_name [Audrey Roy Greenfeld]: Spartacus constant for me/my organization
email [audreyr@example.com]: spartacus@example.com constant for me/my organization
...
project_name [Python Boilerplate]: GladiatorRevolt this will vary.
project_slug [q]: gladiator-revolt this too
...
Run Code Online (Sandbox Code Playgroud)
OK完成。
现在,对于这个项目,我可以通过以下方式轻松重做:
cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git --replay
这很棒!
假设我创建了另一个项目,UnleashHell。
我想以某种方式准备一个文件,其中包含Unleash 的开发人员信息和项目级别信息。而且我希望能够针对这个模板多次运行它,而不必处理提示。这个特殊的 pypi 模板会定期更新,例如,python 2.7 支持已被删除。
A--replay将只为这个 cookiecutter 模板注入最后一次运行。如果它是针对不同的 pypi 项目运行的,那就太糟糕了。
我很擅长开发人员级别的信息,但我需要更改所有项目级别的信息。
cp ~/.cookiecutter_replay/cookiecutter-pypackage.json unleash.json
编辑 …
django ×2
python ×2
cookiecutter ×1
decorator ×1
django-csrf ×1
dynamic ×1
nose ×1
pytest ×1
python-3.6 ×1
python-3.8 ×1
sql-server ×1
sqlalchemy ×1
vue.js ×1
vuejs2 ×1