我正在开发一个Django项目,该项目利用Clusterize.js动态加载div中的"datapoints"列表.在Javascript/HTML方面,最初加载"blackbox"的前200个数据点.如果还有更多,则工作者一次开始加载1000个数据点,直到在滚动列表中获取并呈现所有数据点.当用户单击数据点时,将显示该数据点的详细信息.
最初,有一个错误会导致199以后的任何数据点出现错误的细节.一旦加载任何黑盒子的任何新数据点超过199,错误的数据点ID将传递给Javascript函数showDatapointDetail
,datapoint 200将获得详细信息对于数据点0,数据点201会得到详细为数据点1,等等,直到数据点1199将获取的数据点999的细节.然后数据点1200将获得0和模式将重复.我已经修复了Javascript代码中的这个错误,但现在我正在编写一个很好的测试,tests.py
以确保点击200以上的数据点获得正确的详细信息.该项目一直在使用Python selenium
进行大量的浏览器测试,现在我试图弄清楚如何使用它滚动到动态生成的div的底部.如果我这样做:
dp_detail_199 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "datapoint199")))
Run Code Online (Sandbox Code Playgroud)
然后我可以正确地获得该数据点细节,因为最初只加载了200个.但是,如果黑盒子有787个数据点,那么以下内容将不起作用:
dp_detail_750 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "datapoint750")))
Run Code Online (Sandbox Code Playgroud)
因为需要向下滚动才能开始加载下一个数据点.那么如何使用Selenium滚动到Clusterize生成的列表的底部?div被命名dp_pane
,我可以用Selenium找到它,但我不确定如何正确向下滚动,特别是向下滚动.我尝试过的一件事是首先向下滚动dp_pane
:
driver.execute_script("arguments[0].scrollTop = 12000", dp_pane)
Run Code Online (Sandbox Code Playgroud)
下到datapoint 200,然后向下滚动一点,找到数据点205:
while True:
dp_pane.send_keys(Keys.PAGE_DOWN)
try:
dp_detail_205 = driver.find_element_by_id("datapoint205")
except NoSuchElementException:
######## DEBUG OUTPUT #########
print "Couldn't find dp_detail_205"
continue
else:
######## DEBUG OUTPUT #########
print "Found it!"
break
Run Code Online (Sandbox Code Playgroud)
但这似乎陷入困境,从未找到数据点205; 相反,我只是继续获得调试输出"Couldn't find dp_detail_205"
.我应该怎么做才能让Selenium滚动到底部,dp_pane
以便我可以找到,例如,datapoint750
并验证它是否具有正确的详细信息?最终,我需要的是Selenium让Clusterize加载更多的行,因为这是我需要的一件事,这个测试工作根本没用.甚至Clusterize自己的编程滚动方法也不起作用; 我将使用的行将是这样的:
document.getElementById('dp_pane').scrollTop = 12000;
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,无论我使用scrollTop值多大,它都只能达到数据点199的最低值,并且不会自动加载更多的行.
编辑:
我最近将项目升级到Django 1.9,其中包括与QUnit的集成.乍一看,我认为这是测试Selenium的理想替代品.但是,现在我在阅读一些文件后不确定; 首先,测试涉及首先上传.dat文件,我不确定QUnit可以用于.此外,它可以在Travis CI中轻松实现自动化吗?试图为此进行工作测试已经证明是艰巨的,我不确定在这一点上我还能尝试什么.
在我使用 Celery 的 Django 项目(以及其他一些东西)中,我有一个 Celery 任务,它将在后台将文件上传到数据库。我使用轮询来跟踪上传进度并显示上传进度条。以下是一些详细说明上传过程的片段:
视图.py:
from .tasks import upload_task
...
upload_task.delay(datapoints, user, description) # datapoints is a list of dictionaries, user and description are simple strings
Run Code Online (Sandbox Code Playgroud)
任务.py:
from taskman.celery import app, DBTask # taskman is the name of the Django app that has celery.py
from celery import task, current_task
@task(base=DBTask)
def upload_task(datapoints, user, description):
from utils.db.databaseinserter import insertIntoDatabase
for count in insertIntoDatabase(datapoints, user, description):
percent_completion = int(100 * (float(count) / float(len(datapoints))))
current_task.update_state(state='PROGRESS', meta={'percent':percent_completion})
Run Code Online (Sandbox Code Playgroud)
数据库插入器.py:
def insertIntoDatabase(datapoints, user, …
Run Code Online (Sandbox Code Playgroud) 我目前的目标是让Travis在我们的Git master分支成功合并拉取请求后部署我们的Django + Docker-Compose项目.我已经完成了一些设置我们的AWS CodeDeploy的工作,因为Travis已经内置了对它的支持.当我到达AppSpec和实际部署部分时,首先我尝试使用AfterInstall脚本docker-compose build
,然后使用ApplicationStart脚本docker-compose up
.从Web中提取图像的容器是我们的PostgreSQL容器(命名为db
image aidanlister/postgres-hstore
,这是通常的postgres
图像加上hstore扩展名),Redis容器(使用redis
图像)和Selenium容器(图像selenium/standalone-firefox
).其他两个容器,web
以及worker
,分别Django的服务器和芹菜工作者,使用相同的Dockerfile构建的图像.主要命令是:
CMD paver docker_run
Run Code Online (Sandbox Code Playgroud)
它使用一个pavement.py
文件:
from paver.easy import task
from paver.easy import sh
@task
def docker_run():
migrate()
collectStatic()
updateRequirements()
startServer()
@task
def migrate():
sh('./manage.py makemigrations --noinput')
sh('./manage.py migrate --noinput')
@task
def collectStatic():
sh('./manage.py collectstatic --noinput')
# find any updates to existing packages, install any new packages
@task
def updateRequirements():
sh('pip install --upgrade -r requirements.txt') …
Run Code Online (Sandbox Code Playgroud) django amazon-ec2 amazon-web-services travis-ci docker-compose
在我的Django项目中,我有一个名为Value
GenericForeignKey 的模型:
class Value(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
val_id = models.PositiveIntegerField(blank=True, null=True)
data_obj = GenericForeignKey('content_type', 'val_id')
Run Code Online (Sandbox Code Playgroud)
Value
是一种多态表,它使用ContentType和GenericForeignKey来指向包含实际数据的任意表.例如,有一个模型Int
,一个Value
可以指向:
class Int(models.Model):
data = models.IntegerField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
因此,在创建一个实例后Int
:
myint = Int.objects.create(data=1)
Run Code Online (Sandbox Code Playgroud)
我可以创建一个Value
指向它的:
myval = Value.objects.create(data_obj=myint)
Run Code Online (Sandbox Code Playgroud)
还有其他同类机型,一个Value
将指向,比如UInt
,String
和Float
; 他们都只有一个领域data
.但是,我想知道如何Value
根据字段指向的模型包含的数据查询/过滤实例data_obj
.即,我希望能够做到这样的事情:
Value.objects.filter(data_obj__data=1)
Run Code Online (Sandbox Code Playgroud)
但这会导致错误:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 122, in manager_method
return …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理。我无法弄清楚我到底做错了什么,但尽管控制台日志消息告诉我 Redis 正在运行并接受连接(事实上,当我这样做时docker ps
,我可以看到容器正在运行),我仍然收到有关连接被拒绝的错误。我什至做了
docker exec -it <redis_container_name> redis-cli
ping
Run Code Online (Sandbox Code Playgroud)
并看到响应是PONG
。
这是我的 celery 设置settings.py
:
BROKER_URL = 'redis://localhost:6379/0'
BROKER_TRANSPORT = 'redis'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = "UTC"
Run Code Online (Sandbox Code Playgroud)
这是我的 Redis 容器设置docker-compose.yml
:
redis:
image: redis
ports:
- "6379:6379"
Run Code Online (Sandbox Code Playgroud)
我还记得将redis
容器与我的web
容器链接起来。我可以很好地启动服务器,但是当我尝试将任何内容上传到站点时,出现连接被拒绝的错误。究竟出了什么问题?
编辑:我记得使用 VBoxManage 进行端口转发,这样我就可以转到我的浏览器并访问我的站点localhost:8000
,因此似乎我不需要使用 VM 的 IP 而不是localhost …
我快要让Celery与Django + Docker-Compose项目一起工作了,但是我遇到了一个问题,即工作人员永远无法识别分配给它的任务。基本思想是我有一个insertIntoDatabase
从任务中调用的函数:
myapp / tasks.py:
@task(name='tasks.db_ins')
def db_ins_task(datapoints, user, description):
from utils.db.databaseinserter import insertIntoDatabase
insertIntoDatabase(datapoints, user, description)
Run Code Online (Sandbox Code Playgroud)
在中views.py
,我这样做:
from .tasks import db_ins_task
...
db_ins_task.delay(datapoints, user, description)
Run Code Online (Sandbox Code Playgroud)
datapoints
基本上是字典列表,user
并且description
仅仅是字符串。问题是,当Celery worker容器启动时,db_ins_task
从来没有将其作为列出的任务之一,因此,当我尝试将任何内容上传到我的网站时,会出现以下错误:
worker_1 | [2015-09-25 19:38:00,205: ERROR/MainProcess] Received unregistered task of type u'tasks.db_ins'.
worker_1 | The message has been ignored and discarded.
worker_1 |
worker_1 | Did you remember to import the module containing this task?
worker_1 | Or maybe you are …
Run Code Online (Sandbox Code Playgroud) django ×6
python ×4
celery ×2
javascript ×2
amazon-ec2 ×1
docker ×1
jquery ×1
redis ×1
selenium ×1
travis-ci ×1