我有可以属于一个或多个组织模型实例的事件模型实例.我已经实现了haystack 2.0.0来索引我的所有事件.这是一个示例搜索索引.
class EventIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
organization_slug = indexes.CharField(model_attr='organization__slug',
weight=5.0)
organization_name = indexes.CharField(model_attr='organization__name',
weight=5.0)
name = indexes.CharField(model_attr='name', weight=10.0)
....
def get_model(self):
return Event
def index_queryset(self):
return Event.objects.filter()
Run Code Online (Sandbox Code Playgroud)
我的问题是如何构建一个基于一个或多个组织过滤事件的SearchQuerySet查询. 例如,我想查找属于"orgnization1"和"organization3"的所有事件(其中组织列表可以是任意长度)
作为Django查询,它可能看起来像这样:
Event.objects.filter(organization__in=[orgnization1, organization3]).filter(...)
Run Code Online (Sandbox Code Playgroud)
如何将其转换为haystack查询?这是我的尝试,但我真的不知道我在做什么......
organization_list = [organization1.slug, organization2.slug]
SearchQuerySet().filter_or(organization__contains=organization_list)
Run Code Online (Sandbox Code Playgroud)
以下是我的模型外观的示例:
class Event(models.Model):
name = models.CharField(max_length=64)
organization = models.ForeignKey('mymodule.Organization')
...
class Organization(models.Model):
slug = models.SlugField(max_length=64)
name = models.CharField(max_length=64)
...
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢.
我一直在寻找一种从URL下载图像,在其上执行一些图像处理(调整大小)动作,然后将其保存到django ImageField的方法.使用两个很棒的帖子(下面链接),我已经能够下载图像并将其保存到ImageField.但是,一旦我拥有它,我一直在操作文件时遇到一些麻烦.
具体来说,模型字段save()方法需要File()对象作为第二个参数.所以我的数据最终必须是一个File()对象.下面链接的博客文章显示了如何使用urllib2将图像URL保存到File()对象中.这很好,但是,我还想使用PIL作为Image()对象来操作图像.(或ImageFile对象).
我首选的方法是将图像URL直接加载到Image()对象中,预先形成resize,然后将其转换为File()对象,然后将其保存在模型中.但是,我将Image()转换为File()的尝试失败了.如果可能的话,我想限制我写入磁盘的次数,所以我想在内存中使用这个对象转换或使用NamedTemporaryFile(delete = True)对象,所以我不必担心周围的额外文件.(当然,我希望通过模型保存文件后将文件写入磁盘).
import urllib2
from PIL import Image, ImageFile
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
inStream = urllib2.urlopen('http://www.google.com/intl/en_ALL/images/srpr/logo1w.png')
parser = ImageFile.Parser()
while True:
s = inStream.read(1024)
if not s:
break
parser.feed(s)
inImage = parser.close()
# convert to RGB to avoid error with png and tiffs
if inImage.mode != "RGB":
inImage = inImage.convert("RGB")
# resize could occur here
# START OF CODE THAT DOES NOT SEEM TO WORK
# I need to somehow convert an …Run Code Online (Sandbox Code Playgroud) 我有一个长时间运行的进程,必须每五分钟运行一次,但多个进程实例不应该同时运行.该过程通常不应该超过五分钟,但我想确保第二个实例在它运行时不会启动.
根据之前的建议,我正在使用Django Celery来安排这个长期运行的任务.
我不认为周期性任务会起作用,因为如果我有五分钟的时间,如果任务的另一个实例已经运行,我不希望执行第二个任务.
我目前的实验如下:在8:55,任务的一个实例开始运行.当任务完成时,它将触发另一个自身的实例在接下来的五分钟标记处运行.因此,如果第一个任务在8:57结束,则第二个任务将在9:00运行.如果第一个任务碰巧运行时间很长并且在9:01结束,它将安排下一个实例在9:05运行.
在做以下简单示例之外的任何事情时,我一直在努力解决各种神秘错误.我还没有找到任何其他人从前一个实例调度任务的例子.我想知道是否有更好的方法来做我想做的事情.我知道有一种方法可以命名一个人的任务; 也许有办法搜索具有相同名称的运行或计划实例?有没有人提出任何关于每五分钟运行一次任务的建议,但是确保一次只运行一个任务?
谢谢你,乔
在mymodule/tasks.py中:
import datetime
from celery.decorators import task
@task
def test(run_periodically, frequency):
run_long_process()
now = datetime.datetime.now()
# Run this task every x minutes, where x is an integer specified by frequency
eta = (
now - datetime.timedelta(
minutes = now.minute % frequency , seconds = now.second,
microseconds = now.microsecond ) ) + datetime.timedelta(minutes=frequency)
task = test.apply_async(args=[run_periodically, frequency,], eta=eta)
Run Code Online (Sandbox Code Playgroud)
从./manage.py shell:
from mymodule import tasks
result = tasks.test.apply_async(args=[True, 5])
Run Code Online (Sandbox Code Playgroud) 我有一个现有的系统,我希望限制管理内联中显示的相关对象的数量.
例如,我在管理员中有一个模型,其内联可以包含多达数千个相关记录.我只想显示最近的记录(比如5K最重要的记录).(理想情况下,一个人可以通过内联记录进行分页,但只是限制它们就足够了.)我想避免管理页面加载60K内联记录的情况,这会使浏览器崩溃并对服务器征税.
基于以下SO问题,我创建了以下片段: 如何限制查询集/要在Django管理站点中查看的记录?
class TicketNoteAdmin(models.TabularInline):
model = models.TicketNote
def queryset(self, request):
qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created')[:5000]
return qs
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个"切片一旦切片就无法过滤查询".我甚至尝试使用分页器,但得到了同样的错误.
from django.core.paginator import Paginator
class TicketNoteAdmin(models.TabularInline):
model = models.TicketNote
def queryset(self, request):
qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created')
p = Paginator(qs, 5000)
page1 = p.page(1)
return page1.object_list
Run Code Online (Sandbox Code Playgroud)
我理解为什么我会收到此错误,但我想知道是否有一种不同的方法可以限制显示的内联对象的数量.也许管理员不是设计用于处理这么多内联对象,但是觉得必须有限制管理内联记录集的方法,并防止因为内联对象太多导致浏览器/服务器崩溃的情况.任何建议都非常感谢.谢谢你的阅读.
我有一个关于新的Django 1.3静态文件框架的一般性问题.
我非常喜欢Django 1.3中引入的新Django静态文件功能.通常,我设置STATIC_URL ="/ static /"并在我的模板中输入{{STATIC_URL}}模板标签.开发服务器自动提供静态文件的方式非常棒,我的所有内容都按预期提供.
The {{ STATIC_URL }} would be substituted in the template and might serve up files like this...
example.com/static/css/master.css
example.com/static/images/logo.png
example.com/static/js/site.js
Run Code Online (Sandbox Code Playgroud)
但是,我正在使用旧网站,其中静态媒体安装在网址根目录.例如,静态URL的路径可能如下所示:
example.com/css/master.css
example.com/images/logo.png
example.com/js/site.js
Run Code Online (Sandbox Code Playgroud)
它不使用"静态"url命名空间.
我想知道是否有办法让新的静态文件功能不使用静态命名空间并提供上面的URL,但仍然保留了新的静态文件框架(开发服务器提供的collectstatic,静态文件等)的好处.我尝试设置STATIC_URL =""和STATIC_URL ="/",但似乎都没有达到预期的效果.
有没有办法配置静态文件来提供没有命名空间的静态文件?谢谢你的考虑.
我正在尝试覆盖使用fastcgi_pass时传递给基于php的应用程序(特别是Phabricator)的http主机头.
我在使用proxy_pass时发现了很多这样做的例子,但我似乎无法找到如何使用fastcgi_pass执行此操作的示例.具体来说,我希望代理的php应用程序将主机头看作"phabricator.localhost".
(这样做的原因是我想将几个不同的域与Phabricator webapp相关联,但它只允许一个域关联,并且它拒绝任何未创建该域的请求.)
我很擅长用FastCGI配置Nginx,所以我不确定fastcgi的工作原理.任何帮助表示赞赏.
这是我的Nginx服务器配置:
server {
server_name phabricator.localhost www.example.com example.com;
root /opt/phabricator/phabricator/webroot;
location / {
index index.php;
rewrite ^/(.*)$ /index.php?__path__=/$1 last;
}
location = /favicon.ico {
try_files $uri =204;
}
location /index.php {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
#### HERE ARE MY ATTEMPTS #####
#proxy_set_header HOST phabricator.localhost;
#fastcgi_param SERVER_NAME phabricator.localhost;
#fastcgi_pass_header 'Host: phabricator.localhost';
#fastcgi_pass_header 'Host: phabricator.localhost';
#add_header Host phabricator.localhost;
#proxy_set_header Host phabricator.localhost;
#### END ATTEMPTS ####
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种很好的方法,只使用一个域名在同一台服务器上安装多个完全不同的Django项目.关键是我想要浏览以下内容:
http://192.168.0.1/gallery/#jango 照片库项目
http://192.168.0.1/blog/#a blogging project
这样,我可以通过引用不同的URL在同一台服务器上开发和测试多个django项目.(注意:我不认为这个Django Sites模块是我正在寻找的,因为项目需要与众不同).作为一个例子,PHP的行为就像这样,因为我可以在同一台服务器上安装类似php-gallery和phpmyadmin的东西,只是使用不同的URL路径.
有没有人知道如何使用Apache(使用mod_python或mod_wsgi)在单个服务器上的多个URL下设置多个Django项目的任何好资源?我想知道的事情是如何设置apache.conf,可能的virtualenv设置,以及对urls.py的更改以适应这种情况.我看到的大多数Django部署示例都是针对每个域或子域的一个应用程序.
任何建议都非常感谢.
谢谢,
乔
摘要
我有一个内部和外部域指向它的单个Web应用程序,我希望robots.txt阻止对内部域的所有访问,但允许所有访问外部域.
问题细节
我有一个简单的Nginx服务器块,我用它来代理Django应用程序(见下文).如您所见,此服务器块响应任何域(由于缺少server_name参数).但是,我想知道如何标记特定域名,例如Nginx将为他们提供自定义robots.txt文件.
更具体地说,域example.com和www.example.com将提供htdocs目录中的默认robots.txt文件.(由于设置了"root/sites/mysite/htdocs",并且robots.txt文件位于/sites/mysite/htdocs/robots.txt)
但是,我还希望域"example.internal.com"(它指的是与example.com相同的服务器)提供自定义的robots.txt文件; 我想创建一个自定义robots.txt,以便google不会将该内部域编入索引.
我想到了重复服务器块并在其中一个服务器块中指定以下内容.然后以某种方式覆盖该服务器块中的robots.txt查找.
"server_name internal.example.com;"
Run Code Online (Sandbox Code Playgroud)
但是为了这个目的而重复整个服务器块似乎并不是很干.
我还想过可能会使用if语句来检查主机头是否包含内部域.然后以这种方式提供自定义robots.txt文件.但是Nginx说如果是邪恶的话.
为内部域提供自定义robots.txt文件的好方法是什么?
谢谢您的帮助.
这是我正在使用的服务器块的代码示例.
upstream app_server {
server unix:/sites/mysite/var/run/wsgi.socket fail_timeout=0;
}
server {
listen 80;
root /sites/mysite/htdocs;
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个自定义函数,我可以放在一个查询集"链"中,它将过滤器应用于查询集.与普通的Django查询集过滤器一样,它会将查询集置于其左侧,并将生成的查询集传递到右侧.
在将自定义函数添加到queryset链之前:
models.MyModel.objects.all()
models.MyModel.objects.some_manger_function()
models.MyModel.objects.some_manger_function().count()
models.MyModel.objects.some_manger_function().filter(title='something')
Run Code Online (Sandbox Code Playgroud)
将我的自定义函数添加到查询集链后:
models.MyModel.objects.all().my_custom_filter()
models.MyModel.objects.some_manger_function().my_custom_filter()
models.MyModel.objects.some_manger_function().my_custom_filter().count()
models.MyModel.objects.some_manger_function().my_custom_filter()\
.filter(title='something')
Run Code Online (Sandbox Code Playgroud)
我不知道如何构建我的函数来做到这一点.它周围需要某种装饰器吗?
???? def my_custom_filter(???):
???? return qs.filter(id__gte=10)
Run Code Online (Sandbox Code Playgroud)
有谁知道一个很好的方法来实现这一目标?
以下可能会有效,但我希望能有更像Django的东西.
def my_custom_filter(qs):
return qs.filter(id__gte=1)
my_custom_filter(models.MyModel.objects.all()).count()
Run Code Online (Sandbox Code Playgroud)
任何建议都非常感谢.
谢谢,乔
更新:我正在尝试解决Ignacio解决方案的细节.我没有用QuerySet覆盖做太多,所以我拼凑了我能找到的东西......
class MyQuerySet(QuerySet):
def filter(self, *args, **kwargs):
return super(self.__class__, self).filter(*args, **kwargs).\
filter(id__gt=5)
class MyManager(models.Manager):
def testqs(self):
return MyQuerySet(self.model)
Run Code Online (Sandbox Code Playgroud)
但是,我认为这不符合我的预期.有什么建议?
>>> models.MyModel.objects.testqs().filter()
Run Code Online (Sandbox Code Playgroud)
更新2:本文证明是有用的. http://zmsmith.com/2010/04/using-custom-django-querysets/
我使用Mongodb和mongoengine作为Django API的后端.我用来创建api的框架是Django Rest Framework.
我需要在Mongo中的字段中存储字典,并且在调用方法post时我所做的最好的是使用charfield并在函数restore_object中解析字典.
有更好的方法来实现这一目标吗?
创建一个字典字段会更好吗?我不知道这有多难.
谢谢.
编辑显示一些代码,注意我将字典存储为字典(DictField),它的内容可以从一个对象更改为其他对象.
我的mongoengine模型是这样的:
class MyDoc(mongoengine.Document):
name = mongoengine.StringField(max_length=200)
context = mongoengine.DictField()
Run Code Online (Sandbox Code Playgroud)
和我的序列化器类似:
class MyDocSerializer(serializers.Serializer):
name = serializers.CharField(max_length=200)
context = serializers.CharField()
url = serializers.HyperlinkedIdentityField(
view_name="drf:mydoc-detail",)
def __init__(self,*args,**kwargs):
super(MyDocSerializer,self).__init__(*args,**kwargs)
def restore_object(self, attrs, instance=None):
#Parse string to dict
#this is so ugly, notice I had to repace ' for " to
#avoid an error parsing the json
context = JSONParser().parse(
StringIO.StringIO(
attrs['context'].replace("'","\"")
)
)
attrs['context'] = context
if instance is not None:
instance.name = attrs['name']
instance.context …Run Code Online (Sandbox Code Playgroud) django ×9
nginx ×2
python ×2
apache ×1
celery ×1
concurrency ×1
css ×1
django-admin ×1
django-forms ×1
dns ×1
fastcgi ×1
file ×1
filter ×1
function ×1
hostheader ×1
inline ×1
media ×1
model ×1
mongodb ×1
mongoengine ×1
pagination ×1
phabricator ×1
php ×1
rabbitmq ×1
relation ×1
robots.txt ×1
search ×1
static ×1
urllib2 ×1