Full-text multi-table search application for Django. Easy to install and use, with good performance.

Related tags

Django django-watson
Overview

django-watson

Build Status PyPI GitHub license

django-watson is a fast multi-model full-text search plugin for Django.

It is easy to install and use, and provides high quality search results.

Features

  • Search across multiple models.
  • Order results by relevance.
  • No need to install additional third-party modules or services.
  • Fast and scaleable enough for most use cases.
  • Supports Django 1.11+, Python 3.6+.

Documentation

Please read the Getting Started guide for more information.

Download instructions, bug reporting and links to full documentation can be found at the main project website.

You can keep up to date with the latest announcements by joining the django-watson discussion group.

Contributing

Bug reports, bug fixes, and new features are always welcome. Please raise issues on the django-watson github repository, and submit pull requests for any new code.

You can run the test suite yourself from within a virtual environment with the following commands.

    pip install psycopg2 mysqlclient -e .
    tests/runtests.py
    tests/runtests.py -d psql
    tests/runtests.py -d mysql

More information

The django-watson project was developed by Dave Hall. You can get the code from the django-watson project site.

Dave Hall is a freelance web developer, based in Cambridge, UK. You can usually find him on the Internet in a number of different places:

Comments
  • Building the index from scratch takes a while

    Building the index from scratch takes a while

    170000 records took about an hour to build. Can we parallelize some of the work so that for example each model will use a different process to build it's index? We could use the ProcessPoolExecutor if it's available. What do you think?

    opened by thedrow 26
  • AppRegistryNotReady exception

    AppRegistryNotReady exception

    Hello,

    I can't register a model in watson anymore since I've upgraded to Django 1.9.

    It raises a AppRegistryNotReady exception. I'm using an AppConfig for my module set in my init.py file :

    from django.apps import AppConfig
    from watson import search as watson
    
    class ProduitsConfig(AppConfig):
        name = "moderation.apps.produits"
    
        def ready(self):
            ProduitModel = self.get_model("Produit")
            watson.register(ProduitModel, fields=("nom", "marque__nom", "marque__pays__nom", "marque__region__nom", "type", "couleur"))
    

    When I comment the watson import and the register line, I don't have any error.

    Am I missing something ?

    opened by tsebire 23
  • Inconsistent behaviour of full text search on different postgres versions

    Inconsistent behaviour of full text search on different postgres versions

    >>> watson.search(u"&")
    *** DatabaseError: FEHLER:  Syntaxfehler in tsquery: »&:*«
    

    ("FEHLER" == error in german)

    also I quite don't understand this:

    >>> watson.filter(jobs, "Geophys")
    [<Job: Professor in Geophysics>, <Job: Assistant or Associate Professor in Structural Geology-Active Tectonics>]
    >>> watson.filter(jobs, "Geophysics")
    []
    

    with the following (simplified) model.py file

    from django.db import models
    import watson
    
    class Job(models.Model):
        title = models.CharField(max_length=80)
        job_description = models.TextField()
    
        def __unicode__(self):
            return "%s" % (self.title)
    
    watson.register(Job, fields=("title", "job_description",))
    
    opened by barsch 19
  • AttributeError at /search/ 'NoneType' object has no attribute '_meta'

    AttributeError at /search/ 'NoneType' object has no attribute '_meta'

    I've been bashing against the wall for a few hours now.

    I've tried a host of different things, but am stumped (and clueless).

    I suspect it's related to my project setup: meaning, I have two apps in my django project: api, which houses the models, and website, which is a 'naked' app with no models (just the views, templates, and urls). website imports api.models. I am registering the models with watson in the api app, and the search engine works flawlessly from the command line.

    Thanks...

    AttributeError at /search/
    'NoneType' object has no attribute '_meta'
    Request Method: GET
    Request URL:    http://localhost:8000/search/?q=voices
    Django Version: 1.7.4
    Exception Type: AttributeError
    Exception Value:    
    'NoneType' object has no attribute '_meta'
    Exception Location: /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/watson/templatetags/watson.py in search_result_item, line 33
    Python Executable:  /Users/dbinetti/.virtualenvs/barberscore/bin/python2.7
    Python Version: 2.7.9
    Python Path:    
    ['/Users/dbinetti/.virtualenvs/barberscore/bin',
     '/Users/dbinetti/Repos/barberscore/project',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python27.zip',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/plat-darwin',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/plat-mac',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/plat-mac/lib-scriptpackages',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/lib-tk',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/lib-old',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/lib-dynload',
     '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
     '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
     '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
     '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
     '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
     '/Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages']
    Server time:    Thu, 29 Jan 2015 13:35:55 -0800
    Error during template rendering
    
    In template /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/watson/templates/watson/includes/search_results.html, error at line 6
    'NoneType' object has no attribute '_meta'
    1   {% load watson %}
    2   {% if search_results %}
    3       <ul class="search-results">
    4           {% for search_result in search_results %}
    5               <li>
    6                   {% search_result_item search_result %}
    7               </li>
    8           {% endfor %}
    9       </ul>
    10  {% endif %}
    Traceback Switch to copy-and-paste view
    
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/core/handlers/base.py in get_response
                    response = response.render() ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/response.py in render
                self.content = self.rendered_content ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/response.py in rendered_content
            content = template.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                return self._render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in _render
            return self.nodelist.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                    bit = self.render_node(node, context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/debug.py in render_node
                return node.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/defaulttags.py in render
                    return nodelist.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                    bit = self.render_node(node, context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/debug.py in render_node
                return node.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                        return func(*resolved_args, **resolved_kwargs) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/watson/templatetags/watson.py in search_results
            return template.loader.render_to_string("watson/includes/search_results.html", context) ...
    ▼ Local vars
    Variable    Value
    search_results  
    [<SearchEntry: Voices of Gotham (rename)>, <SearchEntry: Voices of Gotham>, <SearchEntry: Voices of California (rename)>, <SearchEntry: Voices of California>, <SearchEntry: Voices in Harmony (rename)>, <SearchEntry: Voices in Harmony>]
    context 
    [{'False': False, 'None': None, 'True': True}, {u'paginator': None, u'search_results': [<SearchEntry: Voices of Gotham (rename)>, <SearchEntry: Voices of Gotham>, <SearchEntry: Voices of California (rename)>, <SearchEntry: Voices of California>, <SearchEntry: Voices in Harmony (rename)>, <SearchEntry: Voices in Harmony>], u'object_list': [<SearchEntry: Voices of Gotham (rename)>, <SearchEntry: Voices of Gotham>, <SearchEntry: Voices of California (rename)>, <SearchEntry: Voices of California>, <SearchEntry: Voices in Harmony (rename)>, <SearchEntry: Voices in Harmony>], u'page_obj': None, u'query': u'voices', u'is_paginated': False, u'view': <watson.views.SearchView object at 0x10e9f6050>}, {u'csrf_token': <django.utils.functional.__proxy__ object at 0x10ea77510>, 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x10ea77650>, u'request': <WSGIRequest
    path:/search/,
    GET:<QueryDict: {u'q': [u'voices']}>,
    POST:<QueryDict: {}>,
    COOKIES:{'csrftoken': 'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc', 'djdt': 'show'},
    META:{'AWS_ACCESS_KEY_ID': 'AKIAIASRKQ66PJ7KIAZQ',
     'AWS_MEDIA_BUCKET_NAME': 'barberscore-files-dev',
     'AWS_SECRET_ACCESS_KEY': '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',
     'AWS_STATIC_BUCKET_NAME': 'barberscore-static-dev',
     'Apple_PubSub_Socket_Render': '/private/tmp/com.apple.launchd.mC1p9mCyGI/Render',
     'CONTENT_LENGTH': '',
     'CONTENT_TYPE': 'text/plain',
     u'CSRF_COOKIE': u'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc',
     'DATABASE_URL': 'postgres://[email protected]/barberscore',
     'DJANGO_DEBUG': 'True',
     'DJANGO_SETTINGS_MODULE': 'settings.dev',
     'DOMAIN': 'localhost',
     'EDITOR': '/Applications/Sublime Text.app/Contents/MacOS/Sublime Text',
     'FULL_NAME': 'David Binetti',
     'GATEWAY_INTERFACE': 'CGI/1.1',
     'HOME': '/Users/dbinetti',
     'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
     'HTTP_ACCEPT_ENCODING': 'gzip, deflate, sdch',
     'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
     'HTTP_CONNECTION': 'keep-alive',
     'HTTP_COOKIE': 'csrftoken=mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc; djdt=show',
     'HTTP_HOST': 'localhost:8000',
     'HTTP_REFERER': 'http://localhost:8000/',
     'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36',
     'LANG': 'en_US.UTF-8',
     'LOGNAME': 'dbinetti',
     'OLDPWD': '/Users/dbinetti',
     'PATH': '/Users/dbinetti/.virtualenvs/barberscore/bin:/usr/local/bin:/usr/local/sbin:/usr/local/opt/ruby/bin:/usr/local/heroku/bin:/opt/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
     'PATH_INFO': u'/search/',
     'PGDATA': '/usr/local/var/postgres',
     'PORT': '8000',
     'PROJECT_HOME': '/Users/dbinetti/Repos',
     'PS1': '\\[\\033[0;32m\\](barberscore)$ \\[\\033[0;00m\\]',
     'PWD': '/Users/dbinetti/Repos/barberscore',
     'PYTHONDONTWRITEBYTECODE': 'True',
     'PYTHONPATH': '/Users/dbinetti/Repos/barberscore/project/',
     'QUERY_STRING': 'q=voices',
     'REMOTE_ADDR': '127.0.0.1',
     'REMOTE_HOST': '',
     'REQUEST_METHOD': 'GET',
     'REUSE_DB': '1',
     'RUN_MAIN': 'true',
     'SCRIPT_NAME': u'',
     'SECRET_KEY': 'x*c*ud&+g-j#%#uj)=m)^yrr!g9#@rw_x8+wzio5qg5gid!o7+',
     'SERVER_NAME': '1.0.0.127.in-addr.arpa',
     'SERVER_PORT': '8000',
     'SERVER_PROTOCOL': 'HTTP/1.1',
     'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.9',
     'SHELL': '/bin/bash',
     'SHLVL': '1',
     'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.nDeR0gqMf7/Listeners',
     'TERM': 'xterm-256color',
     'TERM_PROGRAM': 'Apple_Terminal',
     'TERM_PROGRAM_VERSION': '343.6',
     'TERM_SESSION_ID': '537B5640-762B-42F8-9612-F257ED943BEB',
     'TMPDIR': '/var/folders/fr/_d9wg7416219y9vhpwv05g4r0000gn/T/',
     'TWILIO_ACCOUNT_SID': 'ACb1b9bca9ccef183757e6ebdb64d063c3',
     'TWILIO_ADMIN_NUMBER': '+15005550006',
     'TWILIO_ADMIN_SID': 'PNc708ea5ce72d401fa043e0cb55c4e6b1',
     'TWILIO_AUTH_TOKEN': '41bd31f387ba44b7bfd7cf4965ce06f7',
     'TZ': 'US/Pacific',
     'USER': 'dbinetti',
     'USER_EMAIL': '[email protected]',
     'VIRTUALENVWRAPPER_HOOK_DIR': '/Users/dbinetti/.virtualenvs',
     'VIRTUALENVWRAPPER_PROJECT_FILENAME': '.project',
     'VIRTUALENVWRAPPER_PYTHON': '/usr/local/bin/python',
     'VIRTUALENVWRAPPER_SCRIPT': '/usr/local/bin/virtualenvwrapper.sh',
     'VIRTUALENVWRAPPER_VIRTUALENV': '/usr/local/bin/virtualenv',
     'VIRTUALENVWRAPPER_VIRTUALENV_ARGS': '--no-site-packages',
     'VIRTUAL_ENV': '/Users/dbinetti/.virtualenvs/barberscore',
     'WORKON_HOME': '/Users/dbinetti/.virtualenvs',
     'XPC_FLAGS': '0x0',
     'XPC_SERVICE_NAME': '0',
     '_': '/Users/dbinetti/.virtualenvs/barberscore/bin/django-admin',
     '__CF_USER_TEXT_ENCODING': '0x1F5:0x0:0x0',
     'wsgi.errors': <open file '<stderr>', mode 'w' at 0x10c4031e0>,
     'wsgi.file_wrapper': <class wsgiref.util.FileWrapper at 0x10d6b8738>,
     'wsgi.input': <socket._fileobject object at 0x10dafaa50>,
     'wsgi.multiprocess': False,
     'wsgi.multithread': True,
     'wsgi.run_once': False,
     'wsgi.url_scheme': 'http',
     'wsgi.version': (1, 0),
     (u'watson.search_context_middleware_active', <watson.middleware.SearchContextMiddleware object at 0x10db721d0>): True}>, 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x10db80250>, u'TIME_ZONE': 'US/Pacific', u'STATIC_URL': '/static/', u'LANGUAGES': (('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmal'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-cn', 'Simplified Chinese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese'), ('zh-tw', 'Traditional Chinese')), 'user': <SimpleLazyObject: <function <lambda> at 0x10db6aaa0>>, u'LANGUAGE_CODE': 'en-us', 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'WARNING': 30, 'SUCCESS': 25, 'ERROR': 40}, u'LANGUAGE_BIDI': False, u'MEDIA_URL': '/media/'}, {}]
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/loader.py in render_to_string
            return t.render(Context(dictionary)) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                return self._render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in _render
            return self.nodelist.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                    bit = self.render_node(node, context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/debug.py in render_node
                return node.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/defaulttags.py in render
                    return nodelist.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                    bit = self.render_node(node, context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/debug.py in render_node
                return node.render(context) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/defaulttags.py in render
                                nodelist.append(node.render(context)) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/django/template/base.py in render
                        return func(*resolved_args, **resolved_kwargs) ...
    ▶ Local vars
    /Users/dbinetti/.virtualenvs/barberscore/lib/python2.7/site-packages/watson/templatetags/watson.py in search_result_item
            "app_label": obj._meta.app_label, ...
    ▼ Local vars
    Variable    Value
    obj 
    None
    search_result   
    <SearchEntry: Voices of Gotham (rename)>
    context 
    [{'False': False, 'None': None, 'True': True}, [{'False': False, 'None': None, 'True': True}, {u'paginator': None, u'search_results': [<SearchEntry: Voices of Gotham (rename)>, <SearchEntry: Voices of Gotham>, <SearchEntry: Voices of California (rename)>, <SearchEntry: Voices of California>, <SearchEntry: Voices in Harmony (rename)>, <SearchEntry: Voices in Harmony>], u'object_list': [<SearchEntry: Voices of Gotham (rename)>, <SearchEntry: Voices of Gotham>, <SearchEntry: Voices of California (rename)>, <SearchEntry: Voices of California>, <SearchEntry: Voices in Harmony (rename)>, <SearchEntry: Voices in Harmony>], u'page_obj': None, u'query': u'voices', u'is_paginated': False, u'view': <watson.views.SearchView object at 0x10e9f6050>}, {u'csrf_token': <django.utils.functional.__proxy__ object at 0x10ea77510>, 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x10ea77650>, u'request': <WSGIRequest
    path:/search/,
    GET:<QueryDict: {u'q': [u'voices']}>,
    POST:<QueryDict: {}>,
    COOKIES:{'csrftoken': 'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc', 'djdt': 'show'},
    META:{'AWS_ACCESS_KEY_ID': 'AKIAIASRKQ66PJ7KIAZQ',
     'AWS_MEDIA_BUCKET_NAME': 'barberscore-files-dev',
     'AWS_SECRET_ACCESS_KEY': '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',
     'AWS_STATIC_BUCKET_NAME': 'barberscore-static-dev',
     'Apple_PubSub_Socket_Render': '/private/tmp/com.apple.launchd.mC1p9mCyGI/Render',
     'CONTENT_LENGTH': '',
     'CONTENT_TYPE': 'text/plain',
     u'CSRF_COOKIE': u'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc',
     'DATABASE_URL': 'postgres://[email protected]/barberscore',
     'DJANGO_DEBUG': 'True',
     'DJANGO_SETTINGS_MODULE': 'settings.dev',
     'DOMAIN': 'localhost',
     'EDITOR': '/Applications/Sublime Text.app/Contents/MacOS/Sublime Text',
     'FULL_NAME': 'David Binetti',
     'GATEWAY_INTERFACE': 'CGI/1.1',
     'HOME': '/Users/dbinetti',
     'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
     'HTTP_ACCEPT_ENCODING': 'gzip, deflate, sdch',
     'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
     'HTTP_CONNECTION': 'keep-alive',
     'HTTP_COOKIE': 'csrftoken=mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc; djdt=show',
     'HTTP_HOST': 'localhost:8000',
     'HTTP_REFERER': 'http://localhost:8000/',
     'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36',
     'LANG': 'en_US.UTF-8',
     'LOGNAME': 'dbinetti',
     'OLDPWD': '/Users/dbinetti',
     'PATH': '/Users/dbinetti/.virtualenvs/barberscore/bin:/usr/local/bin:/usr/local/sbin:/usr/local/opt/ruby/bin:/usr/local/heroku/bin:/opt/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
     'PATH_INFO': u'/search/',
     'PGDATA': '/usr/local/var/postgres',
     'PORT': '8000',
     'PROJECT_HOME': '/Users/dbinetti/Repos',
     'PS1': '\\[\\033[0;32m\\](barberscore)$ \\[\\033[0;00m\\]',
     'PWD': '/Users/dbinetti/Repos/barberscore',
     'PYTHONDONTWRITEBYTECODE': 'True',
     'PYTHONPATH': '/Users/dbinetti/Repos/barberscore/project/',
     'QUERY_STRING': 'q=voices',
     'REMOTE_ADDR': '127.0.0.1',
     'REMOTE_HOST': '',
     'REQUEST_METHOD': 'GET',
     'REUSE_DB': '1',
     'RUN_MAIN': 'true',
     'SCRIPT_NAME': u'',
     'SECRET_KEY': 'x*c*ud&+g-j#%#uj)=m)^yrr!g9#@rw_x8+wzio5qg5gid!o7+',
     'SERVER_NAME': '1.0.0.127.in-addr.arpa',
     'SERVER_PORT': '8000',
     'SERVER_PROTOCOL': 'HTTP/1.1',
     'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.9',
     'SHELL': '/bin/bash',
     'SHLVL': '1',
     'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.nDeR0gqMf7/Listeners',
     'TERM': 'xterm-256color',
     'TERM_PROGRAM': 'Apple_Terminal',
     'TERM_PROGRAM_VERSION': '343.6',
     'TERM_SESSION_ID': '537B5640-762B-42F8-9612-F257ED943BEB',
     'TMPDIR': '/var/folders/fr/_d9wg7416219y9vhpwv05g4r0000gn/T/',
     'TWILIO_ACCOUNT_SID': 'ACb1b9bca9ccef183757e6ebdb64d063c3',
     'TWILIO_ADMIN_NUMBER': '+15005550006',
     'TWILIO_ADMIN_SID': 'PNc708ea5ce72d401fa043e0cb55c4e6b1',
     'TWILIO_AUTH_TOKEN': '41bd31f387ba44b7bfd7cf4965ce06f7',
     'TZ': 'US/Pacific',
     'USER': 'dbinetti',
     'USER_EMAIL': '[email protected]',
     'VIRTUALENVWRAPPER_HOOK_DIR': '/Users/dbinetti/.virtualenvs',
     'VIRTUALENVWRAPPER_PROJECT_FILENAME': '.project',
     'VIRTUALENVWRAPPER_PYTHON': '/usr/local/bin/python',
     'VIRTUALENVWRAPPER_SCRIPT': '/usr/local/bin/virtualenvwrapper.sh',
     'VIRTUALENVWRAPPER_VIRTUALENV': '/usr/local/bin/virtualenv',
     'VIRTUALENVWRAPPER_VIRTUALENV_ARGS': '--no-site-packages',
     'VIRTUAL_ENV': '/Users/dbinetti/.virtualenvs/barberscore',
     'WORKON_HOME': '/Users/dbinetti/.virtualenvs',
     'XPC_FLAGS': '0x0',
     'XPC_SERVICE_NAME': '0',
     '_': '/Users/dbinetti/.virtualenvs/barberscore/bin/django-admin',
     '__CF_USER_TEXT_ENCODING': '0x1F5:0x0:0x0',
     'wsgi.errors': <open file '<stderr>', mode 'w' at 0x10c4031e0>,
     'wsgi.file_wrapper': <class wsgiref.util.FileWrapper at 0x10d6b8738>,
     'wsgi.input': <socket._fileobject object at 0x10dafaa50>,
     'wsgi.multiprocess': False,
     'wsgi.multithread': True,
     'wsgi.run_once': False,
     'wsgi.url_scheme': 'http',
     'wsgi.version': (1, 0),
     (u'watson.search_context_middleware_active', <watson.middleware.SearchContextMiddleware object at 0x10db721d0>): True}>, 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x10db80250>, u'TIME_ZONE': 'US/Pacific', u'STATIC_URL': '/static/', u'LANGUAGES': (('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmal'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-cn', 'Simplified Chinese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese'), ('zh-tw', 'Traditional Chinese')), 'user': <SimpleLazyObject: <function <lambda> at 0x10db6aaa0>>, u'LANGUAGE_CODE': 'en-us', 'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'WARNING': 30, 'SUCCESS': 25, 'ERROR': 40}, u'LANGUAGE_BIDI': False, u'MEDIA_URL': '/media/'}, {}]]
    Request information
    
    GET
    Variable    Value
    q   
    u'voices'
    POST
    No POST data
    FILES
    No FILES data
    COOKIES
    Variable    Value
    csrftoken   
    'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc'
    djdt    
    'show'
    META
    Variable    Value
    DOMAIN  
    'localhost'
    wsgi.multiprocess   
    False
    RUN_MAIN    
    'true'
    HTTP_REFERER    
    'http://localhost:8000/'
    PROJECT_HOME    
    '/Users/dbinetti/Repos'
    HTTP_ACCEPT_LANGUAGE    
    'en-US,en;q=0.8'
    SERVER_PROTOCOL 
    'HTTP/1.1'
    SERVER_SOFTWARE 
    'WSGIServer/0.1 Python/2.7.9'
    TERM_PROGRAM_VERSION    
    '343.6'
    TMPDIR  
    '/var/folders/fr/_d9wg7416219y9vhpwv05g4r0000gn/T/'
    PGDATA  
    '/usr/local/var/postgres'
    REQUEST_METHOD  
    'GET'
    LOGNAME 
    'dbinetti'
    USER    
    'dbinetti'
    PATH    
    '/Users/dbinetti/.virtualenvs/barberscore/bin:/usr/local/bin:/usr/local/sbin:/usr/local/opt/ruby/bin:/usr/local/heroku/bin:/opt/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin'
    QUERY_STRING    
    'q=voices'
    HOME    
    '/Users/dbinetti'
    SECRET_KEY  
    'x*c*ud&+g-j#%#uj)=m)^yrr!g9#@rw_x8+wzio5qg5gid!o7+'
    VIRTUALENVWRAPPER_SCRIPT    
    '/usr/local/bin/virtualenvwrapper.sh'
    PORT    
    '8000'
    TERM_PROGRAM    
    'Apple_Terminal'
    LANG    
    'en_US.UTF-8'
    TERM    
    'xterm-256color'
    SHELL   
    '/bin/bash'
    VIRTUALENVWRAPPER_PYTHON    
    '/usr/local/bin/python'
    HTTP_COOKIE 
    'csrftoken=mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc; djdt=show'
    SERVER_NAME 
    '1.0.0.127.in-addr.arpa'
    REMOTE_ADDR 
    '127.0.0.1'
    SHLVL   
    '1'
    TWILIO_ACCOUNT_SID  
    'ACb1b9bca9ccef183757e6ebdb64d063c3'
    XPC_FLAGS   
    '0x0'
    wsgi.url_scheme 
    'http'
    USER_EMAIL  
    '[email protected]'
    SERVER_PORT 
    '8000'
    CONTENT_LENGTH  
    ''
    VIRTUALENVWRAPPER_VIRTUALENV    
    '/usr/local/bin/virtualenv'
    HTTP_CONNECTION 
    'keep-alive'
    HTTP_USER_AGENT 
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36'
    VIRTUALENVWRAPPER_VIRTUALENV_ARGS   
    '--no-site-packages'
    WORKON_HOME 
    '/Users/dbinetti/.virtualenvs'
    TERM_SESSION_ID 
    '537B5640-762B-42F8-9612-F257ED943BEB'
    XPC_SERVICE_NAME    
    '0'
    CONTENT_TYPE    
    'text/plain'
    REUSE_DB    
    '1'
    PYTHONPATH  
    '/Users/dbinetti/Repos/barberscore/project/'
    SSH_AUTH_SOCK   
    '/private/tmp/com.apple.launchd.nDeR0gqMf7/Listeners'
    VIRTUAL_ENV 
    '/Users/dbinetti/.virtualenvs/barberscore'
    TWILIO_AUTH_TOKEN   
    '41bd31f387ba44b7bfd7cf4965ce06f7'
    TWILIO_ADMIN_NUMBER 
    '+15005550006'
    EDITOR  
    '/Applications/Sublime Text.app/Contents/MacOS/Sublime Text'
    wsgi.input  
    <socket._fileobject object at 0x10dafaa50>
    Apple_PubSub_Socket_Render  
    '/private/tmp/com.apple.launchd.mC1p9mCyGI/Render'
    PS1 
    '\\[\\033[0;32m\\](barberscore)$ \\[\\033[0;00m\\]'
    DJANGO_DEBUG    
    'True'
    FULL_NAME   
    'David Binetti'
    wsgi.multithread    
    True
    TZ  
    'US/Pacific'
    PYTHONDONTWRITEBYTECODE 
    'True'
    AWS_ACCESS_KEY_ID   
    'AKIAIASRKQ66PJ7KIAZQ'
    _   
    '/Users/dbinetti/.virtualenvs/barberscore/bin/django-admin'
    HTTP_ACCEPT 
    'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    VIRTUALENVWRAPPER_PROJECT_FILENAME  
    '.project'
    wsgi.file_wrapper   
    ''
    wsgi.version    
    (1, 0)
    VIRTUALENVWRAPPER_HOOK_DIR  
    '/Users/dbinetti/.virtualenvs'
    TWILIO_ADMIN_SID    
    'PNc708ea5ce72d401fa043e0cb55c4e6b1'
    wsgi.run_once   
    False
    CSRF_COOKIE 
    u'mGEwVxCd6Jga16ll5LHCZmZUTE1FzPkc'
    OLDPWD  
    '/Users/dbinetti'
    GATEWAY_INTERFACE   
    'CGI/1.1'
    SCRIPT_NAME 
    u''
    wsgi.errors 
    <open file '<stderr>', mode 'w' at 0x10c4031e0>
    __CF_USER_TEXT_ENCODING 
    '0x1F5:0x0:0x0'
    DATABASE_URL    
    'postgres://[email protected]/barberscore'
    PWD 
    '/Users/dbinetti/Repos/barberscore'
    (u'watson.search_context_middleware_active', <watson.middleware.SearchContextMiddleware object at 0x10db721d0>) 
    True
    DJANGO_SETTINGS_MODULE  
    'settings.dev'
    AWS_SECRET_ACCESS_KEY   
    '+pT4Toz1NDtJ7CvBtBm0U15jBB0k6DiigJULmChP'
    HTTP_HOST   
    'localhost:8000'
    AWS_STATIC_BUCKET_NAME  
    'barberscore-static-dev'
    REMOTE_HOST 
    ''
    HTTP_ACCEPT_ENCODING    
    'gzip, deflate, sdch'
    AWS_MEDIA_BUCKET_NAME   
    'barberscore-files-dev'
    PATH_INFO   
    u'/search/'
    Settings
    Using settings module settings.dev
    Setting Value
    USE_L10N    
    True
    USE_THOUSAND_SEPARATOR  
    False
    CSRF_COOKIE_SECURE  
    False
    LANGUAGE_CODE   
    'en-us'
    ROOT_URLCONF    
    'urls'
    MANAGERS    
    ()
    TEST_NON_SERIALIZED_APPS    
    []
    DEFAULT_CHARSET 
    'utf-8'
    SESSION_SERIALIZER  
    'django.contrib.sessions.serializers.JSONSerializer'
    STATIC_ROOT 
    '/static/'
    ALLOWED_HOSTS   
    ['localhost']
    MESSAGE_STORAGE 
    'django.contrib.messages.storage.fallback.FallbackStorage'
    EMAIL_SUBJECT_PREFIX    
    '[Django] '
    SEND_BROKEN_LINK_EMAILS 
    False
    STATICFILES_FINDERS 
    ('django.contrib.staticfiles.finders.FileSystemFinder',
     'django.contrib.staticfiles.finders.AppDirectoriesFinder')
    SESSION_CACHE_ALIAS 
    'default'
    SESSION_COOKIE_DOMAIN   
    None
    SESSION_COOKIE_NAME 
    'sessionid'
    ADMIN_FOR   
    ()
    TIME_INPUT_FORMATS  
    ('%H:%M:%S', '%H:%M:%S.%f', '%H:%M')
    DATABASES   
    {'default': {'ATOMIC_REQUESTS': False,
                 'AUTOCOMMIT': True,
                 'CONN_MAX_AGE': 0,
                 'ENGINE': 'django.db.backends.postgresql_psycopg2',
                 'HOST': 'localhost',
                 'NAME': 'barberscore',
                 'OPTIONS': {},
                 'PASSWORD': u'********************',
                 'PORT': '',
                 'TEST': {'CHARSET': None,
                          'COLLATION': None,
                          'MIRROR': None,
                          'NAME': None},
                 'TIME_ZONE': 'UTC',
                 'USER': 'dbinetti'}}
    FILE_UPLOAD_DIRECTORY_PERMISSIONS   
    None
    AWS_PRELOAD_METADATA    
    True
    FILE_UPLOAD_PERMISSIONS 
    None
    FILE_UPLOAD_HANDLERS    
    ('django.core.files.uploadhandler.MemoryFileUploadHandler',
     'django.core.files.uploadhandler.TemporaryFileUploadHandler')
    DEFAULT_CONTENT_TYPE    
    'text/html'
    DATABASE_URL    
    'postgres://[email protected]/barberscore'
    APPEND_SLASH    
    True
    FIRST_DAY_OF_WEEK   
    0
    DATABASE_ROUTERS    
    []
    DEFAULT_TABLESPACE  
    ''
    YEAR_MONTH_FORMAT   
    'F Y'
    STATICFILES_STORAGE 
    'django.contrib.staticfiles.storage.StaticFilesStorage'
    CACHES  
    {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
    DOMAIN  
    'localhost'
    SERVER_EMAIL    
    '[email protected]'
    SESSION_COOKIE_PATH 
    '/'
    SILENCED_SYSTEM_CHECKS  
    []
    MIDDLEWARE_CLASSES  
    ('corsheaders.middleware.CorsMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'watson.middleware.SearchContextMiddleware')
    USE_I18N    
    False
    THOUSAND_SEPARATOR  
    ','
    SECRET_KEY  
    u'********************'
    LANGUAGE_COOKIE_NAME    
    'django_language'
    DEFAULT_INDEX_TABLESPACE    
    ''
    TRANSACTIONS_MANAGED    
    False
    LOGGING_CONFIG  
    'logging.config.dictConfig'
    TEMPLATE_LOADERS    
    ('django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader')
    WSGI_APPLICATION    
    'wsgi.application'
    TEMPLATE_DEBUG  
    True
    X_FRAME_OPTIONS 
    'SAMEORIGIN'
    CSRF_COOKIE_NAME    
    'csrftoken'
    FORCE_SCRIPT_NAME   
    None
    USE_X_FORWARDED_HOST    
    False
    SIGNING_BACKEND 
    'django.core.signing.TimestampSigner'
    SESSION_COOKIE_SECURE   
    False
    CACHE_MIDDLEWARE_KEY_PREFIX 
    u'********************'
    CSRF_COOKIE_DOMAIN  
    None
    FILE_CHARSET    
    'utf-8'
    DEBUG   
    True
    PHONENUMBER_DEFAULT_REGION  
    'US'
    LANGUAGE_COOKIE_DOMAIN  
    None
    AWS_ACCESS_KEY_ID   
    u'********************'
    DEFAULT_FILE_STORAGE    
    'django.core.files.storage.FileSystemStorage'
    INSTALLED_APPS  
    ('utils',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.admin',
     'django.contrib.admindocs',
     'django.contrib.humanize',
     'timezone_field',
     'easy_select2',
     'corsheaders',
     'watson',
     'noncense',
     'rest_framework',
     'api',
     'website')
    LANGUAGES   
    (('af', 'Afrikaans'),
     ('ar', 'Arabic'),
     ('ast', 'Asturian'),
     ('az', 'Azerbaijani'),
     ('bg', 'Bulgarian'),
     ('be', 'Belarusian'),
     ('bn', 'Bengali'),
     ('br', 'Breton'),
     ('bs', 'Bosnian'),
     ('ca', 'Catalan'),
     ('cs', 'Czech'),
     ('cy', 'Welsh'),
     ('da', 'Danish'),
     ('de', 'German'),
     ('el', 'Greek'),
     ('en', 'English'),
     ('en-au', 'Australian English'),
     ('en-gb', 'British English'),
     ('eo', 'Esperanto'),
     ('es', 'Spanish'),
     ('es-ar', 'Argentinian Spanish'),
     ('es-mx', 'Mexican Spanish'),
     ('es-ni', 'Nicaraguan Spanish'),
     ('es-ve', 'Venezuelan Spanish'),
     ('et', 'Estonian'),
     ('eu', 'Basque'),
     ('fa', 'Persian'),
     ('fi', 'Finnish'),
     ('fr', 'French'),
     ('fy', 'Frisian'),
     ('ga', 'Irish'),
     ('gl', 'Galician'),
     ('he', 'Hebrew'),
     ('hi', 'Hindi'),
     ('hr', 'Croatian'),
     ('hu', 'Hungarian'),
     ('ia', 'Interlingua'),
     ('id', 'Indonesian'),
     ('io', 'Ido'),
     ('is', 'Icelandic'),
     ('it', 'Italian'),
     ('ja', 'Japanese'),
     ('ka', 'Georgian'),
     ('kk', 'Kazakh'),
     ('km', 'Khmer'),
     ('kn', 'Kannada'),
     ('ko', 'Korean'),
     ('lb', 'Luxembourgish'),
     ('lt', 'Lithuanian'),
     ('lv', 'Latvian'),
     ('mk', 'Macedonian'),
     ('ml', 'Malayalam'),
     ('mn', 'Mongolian'),
     ('mr', 'Marathi'),
     ('my', 'Burmese'),
     ('nb', 'Norwegian Bokmal'),
     ('ne', 'Nepali'),
     ('nl', 'Dutch'),
     ('nn', 'Norwegian Nynorsk'),
     ('os', 'Ossetic'),
     ('pa', 'Punjabi'),
     ('pl', 'Polish'),
     ('pt', 'Portuguese'),
     ('pt-br', 'Brazilian Portuguese'),
     ('ro', 'Romanian'),
     ('ru', 'Russian'),
     ('sk', 'Slovak'),
     ('sl', 'Slovenian'),
     ('sq', 'Albanian'),
     ('sr', 'Serbian'),
     ('sr-latn', 'Serbian Latin'),
     ('sv', 'Swedish'),
     ('sw', 'Swahili'),
     ('ta', 'Tamil'),
     ('te', 'Telugu'),
     ('th', 'Thai'),
     ('tr', 'Turkish'),
     ('tt', 'Tatar'),
     ('udm', 'Udmurt'),
     ('uk', 'Ukrainian'),
     ('ur', 'Urdu'),
     ('vi', 'Vietnamese'),
     ('zh-cn', 'Simplified Chinese'),
     ('zh-hans', 'Simplified Chinese'),
     ('zh-hant', 'Traditional Chinese'),
     ('zh-tw', 'Traditional Chinese'))
    COMMENTS_ALLOW_PROFANITIES  
    False
    TWILIO_AUTH_TOKEN   
    u'********************'
    STATIC_STORAGE  
    'django.contrib.staticfiles.storage.StaticFilesStorage'
    STATICFILES_DIRS    
    ()
    PHONENUMBER_DEFAULT_FORMAT  
    'NATIONAL'
    SECURE_PROXY_SSL_HEADER 
    ('HTTP_X_FORWARDED_PROTO', 'https')
    LANGUAGE_COOKIE_AGE 
    None
    SESSION_COOKIE_HTTPONLY 
    True
    AWS_SECRET_ACCESS_KEY   
    u'********************'
    DEBUG_PROPAGATE_EXCEPTIONS  
    False
    INTERNAL_IPS    
    ()
    AWS_MEDIA_BUCKET_NAME   
    'barberscore-files-dev'
    MONTH_DAY_FORMAT    
    'F j'
    LOGIN_URL   
    'login'
    SESSION_EXPIRE_AT_BROWSER_CLOSE 
    False
    TIME_FORMAT 
    'P'
    AUTH_USER_MODEL 
    'noncense.User'
    DATE_INPUT_FORMATS  
    ('%Y-%m-%d',
     '%m/%d/%Y',
     '%m/%d/%y',
     '%b %d %Y',
     '%b %d, %Y',
     '%d %b %Y',
     '%d %b, %Y',
     '%B %d %Y',
     '%B %d, %Y',
     '%d %B %Y',
     '%d %B, %Y')
    AUTHENTICATION_BACKENDS 
    ('noncense.backends.MobileBackend',
     'django.contrib.auth.backends.ModelBackend')
    EMAIL_HOST_PASSWORD 
    u'********************'
    PASSWORD_RESET_TIMEOUT_DAYS 
    u'********************'
    SESSION_FILE_PATH   
    None
    CACHE_MIDDLEWARE_ALIAS  
    'default'
    TWILIO_ACCOUNT_SID  
    'ACb1b9bca9ccef183757e6ebdb64d063c3'
    SESSION_SAVE_EVERY_REQUEST  
    False
    NUMBER_GROUPING 
    0
    SESSION_ENGINE  
    'django.contrib.sessions.backends.db'
    CSRF_FAILURE_VIEW   
    'django.views.csrf.csrf_failure'
    CSRF_COOKIE_PATH    
    '/'
    LOGIN_REDIRECT_URL  
    'home'
    PROJECT_ROOT    
    '/Users/dbinetti/Repos/barberscore/project'
    DECIMAL_SEPARATOR   
    '.'
    SELECT2_USE_BUNDLED_JQUERY  
    False
    MESSAGE_TAGS    
    {40: 'danger'}
    LOCALE_PATHS    
    ()
    TEMPLATE_STRING_IF_INVALID  
    ''
    LOGOUT_URL  
    'logout'
    EMAIL_USE_TLS   
    False
    FIXTURE_DIRS    
    ()
    EMAIL_HOST  
    'localhost'
    DATE_FORMAT 
    'N j, Y'
    MEDIA_ROOT  
    '/Users/dbinetti/Repos/barberscore/project/media'
    DEFAULT_EXCEPTION_REPORTER_FILTER   
    'django.views.debug.SafeExceptionReporterFilter'
    ADMINS  
    ()
    FORMAT_MODULE_PATH  
    None
    DEFAULT_FROM_EMAIL  
    '[email protected]'
    REST_FRAMEWORK  
    {'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.AllowAny']}
    MEDIA_URL   
    '/media/'
    DATETIME_FORMAT 
    'N j, Y, P'
    TEMPLATE_DIRS   
    ()
    DISALLOWED_USER_AGENTS  
    ()
    ALLOWED_INCLUDE_ROOTS   
    ()
    LOGGING 
    {'disable_existing_loggers': True,
     'formatters': {'simple': {'format': '%(levelname)s %(message)s'}},
     'handlers': {'console': {'class': 'logging.StreamHandler',
                              'formatter': 'simple',
                              'level': 'DEBUG'}},
     'loggers': {'api': {'handlers': ['console'], 'level': 'DEBUG'},
                 'noncense': {'handlers': ['console'], 'level': 'DEBUG'},
                 'utils': {'handlers': ['console'], 'level': 'DEBUG'},
                 'website': {'handlers': ['console'], 'level': 'DEBUG'}},
     'version': 1}
    PREPEND_WWW 
    False
    SHORT_DATE_FORMAT   
    'm/d/Y'
    PROJECT_NAME    
    'barberscore'
    TEST_RUNNER 
    'django.test.runner.DiscoverRunner'
    IGNORABLE_404_URLS  
    ()
    TIME_ZONE   
    'US/Pacific'
    CORS_ORIGIN_ALLOW_ALL   
    True
    FILE_UPLOAD_MAX_MEMORY_SIZE 
    2621440
    EMAIL_BACKEND   
    'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_USE_SSL   
    False
    TEMPLATE_CONTEXT_PROCESSORS 
    ('django.contrib.auth.context_processors.auth',
     'django.core.context_processors.debug',
     'django.core.context_processors.i18n',
     'django.core.context_processors.media',
     'django.core.context_processors.static',
     'django.core.context_processors.tz',
     'django.contrib.messages.context_processors.messages',
     'django.core.context_processors.request')
    MEDIA_STORAGE   
    'django.core.files.storage.FileSystemStorage'
    SESSION_COOKIE_AGE  
    1209600
    SETTINGS_MODULE 
    'settings.dev'
    USE_ETAGS   
    False
    LANGUAGES_BIDI  
    ('he', 'ar', 'fa', 'ur')
    FILE_UPLOAD_TEMP_DIR    
    None
    CSRF_COOKIE_AGE 
    31449600
    STATIC_URL  
    '/static/'
    EMAIL_PORT  
    25
    USE_TZ  
    True
    SHORT_DATETIME_FORMAT   
    'm/d/Y P'
    PASSWORD_HASHERS    
    u'********************'
    ABSOLUTE_URL_OVERRIDES  
    {}
    LANGUAGE_COOKIE_PATH    
    '/'
    MIGRATION_MODULES   
    {}
    CACHE_MIDDLEWARE_SECONDS    
    600
    CSRF_COOKIE_HTTPONLY    
    False
    DATETIME_INPUT_FORMATS  
    ('%Y-%m-%d %H:%M:%S',
     '%Y-%m-%d %H:%M:%S.%f',
     '%Y-%m-%d %H:%M',
     '%Y-%m-%d',
     '%m/%d/%Y %H:%M:%S',
     '%m/%d/%Y %H:%M:%S.%f',
     '%m/%d/%Y %H:%M',
     '%m/%d/%Y',
     '%m/%d/%y %H:%M:%S',
     '%m/%d/%y %H:%M:%S.%f',
     '%m/%d/%y %H:%M',
     '%m/%d/%y')
    AWS_STATIC_BUCKET_NAME  
    'barberscore-static-dev'
    EMAIL_HOST_USER 
    ''
    PROFANITIES_LIST    
    u'********************'
    You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 500 page.
    
    opened by dbinetti 18
  • ./manage.py buildwatson extremely slow on 0,5 million rows

    ./manage.py buildwatson extremely slow on 0,5 million rows

    In my Postgresql db, there are around 438 972 rows that should be tracked by watson. The problem is that full index build (using the buildwatson management command) is extremely slow.

    (cb)[email protected] /srv/www/cb $ time ./manage.py buildwatson
    
    Killed
    
    real    123m22.753s
    

    Here the process was killed probably because it reached some system limits. It had been running for more than two hours and didn't finish.

    These are register commands I use:

      watson.register(Crag, fields=('normalized_name', 'country'))
      watson.register(Member.objects.all(), fields=('normalized_name', 'user', 'country'))
      watson.register(Event, fields=('normalized_name', 'country'))
      watson.register(Route, fields=('normalized_name', 'crag__name', 'crag__normalized_name'))
    

    The majority of all objects is contained in the Route model (more than 400 000).

    I would be very happy if the time could be reduced somehow.

    opened by clime 17
  • Django 1.7 does not recognize data migrations properly

    Django 1.7 does not recognize data migrations properly

    First, a warning - this may be related to my setup only. But sharing it anyway since it might affect someone else too.

    My webapp uses django-nose for testing. As I was moving it to Django 1.7, I noticed that several of my tests were failing with error similar to this:

        return self.cursor.execute(sql, params)
    ProgrammingError: column watson_searchentry.search_tsv does not exist
    LINE 1: SELECT (ts_rank_cd(watson_searchentry.search_tsv, to_tsquery...
    

    A bit of digging revealed that migrations for watson were not running properly. Django 1.7.1 was claiming that watson was an "unmigrated app" as it had old style "South" migrations which were not being applied during my test run.

    I did try to convert them to new format following Django migrations tutorial, but the migration involving "installwatson" was ignored.

    I ended up resolving it by creating a new data migration for watson (using "python manage.py makemigration --empty watson" and updating the migration file so it looks like this:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    from django.db import models, migrations
    from django.core.management import call_command
    from watson.registration import get_backend
    
    
    def install_watson(apps, schema_editor):
        '''watson needs to be installed in the environment once DB is recreated
        (e.g. during tests). Django 1.7 didn't pick it up during conversion
        from south migrations to this is a workaround
        '''
        ## call_command("installwatson", verbosity=0)
    
        # the command above has problem with @atomic decorator, so we do it
        # manually
    
    
        backend = get_backend()
        if backend.requires_installation:
            backend.do_install()
    
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('watson', '0001_initial'),
        ]
    
        operations = [
            migrations.RunPython(install_watson),
        ]
    

    Sharing it here just in case someone else runs into the same issue.

    opened by JirkaV 15
  • Registering models with django-watson

    Registering models with django-watson

    I dont understand where i need to add this thanks to help me

    from django.apps import AppConfig
    import watson
    
    class YourAppConfig(AppConfig):
        name = "your_app"
        def ready(self):
            YourModel = self.get_model("YourModel")
            watson.register(YourModel)
    
    opened by Astate 14
  • removing patterns import

    removing patterns import

    urls.py raises the following ImportError on Django 1.10:

      File "/Users/simon/files/Projects/language5/env/lib/python2.7/site-packages/watson/urls.py", line 5, in <module>
        from django.conf.urls import url, patterns
    ImportError: cannot import name patterns
    

    ... and patterns isn't needed, so this removes the offending import.

    Also, I think https://github.com/etianen/django-watson/pull/148 can be closed as outdated/fixed.

    opened by SimonGreenhill 13
  • watson.register not working

    watson.register not working

    did watson.register(MyModel) in AppConfig.ready(), watson.search('search term') returned an empty list.

    did watson.register(MyModel) in models.py, watson.search('search term') returned an empty list.

    did watson.register(MyModel) in shell, watson.search('search term') returned an empty list.

    MyModel is filled will models. These models have CharFields and TextFields.

    I'm running Django 1.7 and followed all the instructions for installation, I can see watson_searchentry in my postgresql database. To be clear, I did both manage.py installwatson and manage.py buildwatson. I did manage.py makemigrations, manage.py makemigrations watson (created 0001_initial.py), manage.py migrate (no migrations), manage.py migrate watson (no migrations).

    watson is in my INSTALLED_APPS.

    Here is some code:

    #apps.py
    
    from django.apps import AppConfig
    import watson
    
    class LinksAppConfig(AppConfig):
        name = 'links'
        def ready(self):
              Link = self.get_model('Link')
              watson.register(Link)
    
    #shell 
    in   >> import watson
    in   >> watson.search('charlie')
    out >> []
    

    Link has some models with the name 'charlie' in them.

    Please help

    opened by JMIdeaMaker 13
  • Indexing data only appears to work on save (cleared on buildwatson)

    Indexing data only appears to work on save (cleared on buildwatson)

    I'm having difficulty understanding what is going on with my installation. Let's take this fictional model (I'm using pretty much the same thing):

    class Entry(models.Model):
        title = models.CharField(max_length=255)
        excerpt = models.TextField(blank=True)
        content = models.TextField(blank=True)
        authors = models.ManyToManyField('zinnia.Author', related_name='entries', blank=True, null=False)
        categories = models.ManyToManyField('zinnia.Category', related_name='entries', blank=True, null=True)
        creation_date = models.DateTimeField(default=timezone.now)
        published_date = models.DateTimeField(default=timezone.now)
    
        published = BlogEntryPublishedManager()  # Returns Entries with a published date in the past
    
    
    class EntrySearchAdapter(watson.SearchAdapter):
    
        """ Custom search adapter to improve priority of various fields. """
    
        def get_title(self, obj):
            return obj.title
    
        def get_description(self, obj):
            return obj.excerpt
    
    watson.register(zinnia_entry.published.all()), EntrySearchAdapter, fields=("content", "excerpt", "title", "authors", "categories", "creation_date"))
    

    If I run ./manage.py buildwatson --engine=default on a fresh db (with existing Entry's), I see no new rows added to the table:

    mysql> select * from watson_searchentry;
    Empty set (0.00 sec)
    

    If I save one of the existing entries, everything looks ok now:

    mysql> select * from watson_searchentry;
    ...the serialized content...
    1 row in set (0.00 sec)
    

    If I run ./manage.py buildwatson --engine=default again, it's all empty:

    mysql> select * from watson_searchentry;
    Empty set (0.00 sec)
    
    1. Am I misunderstanding the workflow required to build/refresh the index for existing data?
    2. Why does buildwatson default to the admin engine? Shouldn't it be default?
    opened by chris-erickson 13
  • Clearing the database-cached data?

    Clearing the database-cached data?

    I have a platform where advertisements often get marked as "deleted" if they are not renewed. The problem is that they still appear registered on watson, leading to a 404 error. I believe, in my case, I will have to rebuild the whole search table every time I update watson. Is there any command to clear the table, @etianen ? I want to use it before I run build watson.

    opened by hellvix 12
  • Using non numeric primary keys

    Using non numeric primary keys

    Hi !

    I am using Django Hash ID for my primary keys of my models (https://github.com/nshafer/django-hashid-field). When building indexes of the models django-watson is expecting numeric primary keys. Would it be possible to handle both string and numeric primary keys ? Or do you advise a better strategy for using django-watson in my case ?

    Here is the error log when running buildwatson command:

    Traceback (most recent call last):
      File "/Users/johndoe/repos/myproject/application/./manage.py", line 22, in <module>
        main()
      File "/Users/johndoe/repos/myproject/application/./manage.py", line 18, in main
        execute_from_command_line(sys.argv)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
        utility.execute()
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/django/core/management/base.py", line 414, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/django/core/management/base.py", line 460, in execute
        output = self.handle(*args, **options)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/management/commands/buildwatson.py", line 187, in handle
        refreshed_model_count += rebuild_index_for_model(
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/management/commands/buildwatson.py", line 74, in rebuild_index_for_model
        _bulk_save_search_entries(iter_search_entries(), batch_size=batch_size_)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/search.py", line 207, in _bulk_save_search_entries
        search_entry_batch = list(islice(search_entries, 0, batch_size))
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/management/commands/buildwatson.py", line 47, in iter_search_entries
        for search_entry in search_engine_._update_obj_index_iter(obj):
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/search.py", line 510, in _update_obj_index_iter
        object_id_int, search_entries = self._get_entries_for_obj(obj)
      File "/Users/johndoe/.pyenv/versions/myproject_application/lib/python3.9/site-packages/watson/search.py", line 480, in _get_entries_for_obj
        object_id_int = int(obj.pk)
    
    ValueError: invalid literal for int() with base 10: 'OzZYA4y3q9X5VMGg'
    

    Here OzZYA4y3q9X5VMGg is the hash id of my model (which is the primary key).

    Thank you very much 🙏 !

    opened by girardinsamuel 1
  • Search for a subset by filtering on related model fields

    Search for a subset by filtering on related model fields

    Hello,

    Thanks for creating and maintaining this great package!

    I've run into a situation where I would like to search a subset of models by filtering on a related model's field, like this:

    watson.search("Search terms", models=(MyModel.objects.filter(related__is_public=True),))

    When I try this, I get a django.db.utils.ProgrammingError: column reference "id" is ambiguous error.

    Not sure if i'm missing a configuration, or if this isn't feasible at the moment. Would be great to know a way how to do this.

    Thanks!

    P.S. Here is the actual db error I'm working with, incase something else is going on:

    ERROR:  column reference "id" is ambiguous at character 578
    STATEMENT:  SELECT (ts_rank_cd(watson_searchentry.search_tsv, to_tsquery('pg_catalog.simple', '$$c$$:*'))) AS "watson_rank", "watson_searchentry"."id", "watson_searchentry"."engine_slug", "watson_searchentry"."content_type_id", "watson_searchentry"."object_id", "watson_searchentry"."object_id_int", "watson_searchentry"."title", "watson_searchentry"."description", "watson_searchentry"."content", "watson_searchentry"."url", "watson_searchentry"."meta_encoded" FROM "watson_searchentry" WHERE ("watson_searchentry"."engine_slug" = 'bread' AND "watson_searchentry"."object_id" IN (SELECT ("id"::text) AS "watson_pk_str" FROM "services_servicefirm" U0 INNER JOIN "professionals_company" U1 ON (U0."company_id" = U1."id") WHERE (U1."claimed_on" IS NOT NULL AND U1."deleted_on" IS NULL AND U1."is_public" = true AND U0."deleted_on" IS NULL AND U0."is_public" = true AND U0."membership_is_active" = true)) AND "watson_searchentry"."content_type_id" = 124 AND (search_tsv @@ to_tsquery('pg_catalog.simple', '$$c$$:*'))) ORDER BY "watson_rank" DESC  LIMIT 21
    

    from

    filters = dict(
        company__claimed_on__isnull=False,
        company__deleted_on=None,
        deleted_on=None,
        company__is_public=True,
        is_public=True,
        membership_is_active=True,
    )
    
    watson.search("Search terms", models=(ServiceFirm.objects.filter(**filters),))
    
    opened by ranebo 2
  • psycopg2.errors.UndefinedTable: relation

    psycopg2.errors.UndefinedTable: relation "watson_searchentry" does not exist

    We are seeing this error when you deploy our project. This was working fine till last week or so but not sure what was changed in Watson. Could someone look at it.

    /home/../env/bin/python manage.py makemigrations
    /home/../env/bin/python manage.py migrate
    /home/../env/bin/pip install django-watson
    /home/../bin/python manage.py installwatson
    + /home/../env/bin/python manage.py installwatson
    Traceback (most recent call last):
      File "/home/../env/lib/python3.8/site-packages/django/db/backends/utils.py", line 82, in _execute
        return self.cursor.execute(sql)
    psycopg2.errors.UndefinedTable: relation "watson_searchentry" does not exist
    The above exception was the direct cause of the following exception:
    .........
    ........
    django.db.utils.ProgrammingError: relation "watson_searchentry" does not exist
    script returned exit code 2
    

    Here is the list of versions that we are in our django based web application:

    Django version: 3.1.6
    Python version: 3.8
    Pip version: 21.2.4
    virtualenv version: 20.4.3
    django-watson version: 1.5.5
    
    opened by rkmullapudi 2
  • Added --slice-queryset argument

    Added --slice-queryset argument

    Came across your library and wanted to integrate it for a client, great work!

    However when I was deploying on a relatively big database (2M rows, big model with lots of text data), the process was always getting killed on PythonAnywhere while using all the CPU and ram available, without creating a single index in watson_searchentry.

    So I tinkered a bit and found that .iterator() is the issue in my case (limited resources, MySQL database too), buildwatson doesn't get to create any index, eventually changed the code to slice instead of .iterator and it got through.

    I add an argument to buildwatson called --slice-queryset to slice it instead of iterate, if that works for others in some cases.

    opened by iJohnMaged 6
  • Possible to search with partial match?

    Possible to search with partial match?

    I love this library and have been using it on all websites. However, there is one issue that need solution.

    If I search 'example', result is given. If I search 'some extra text example' no results given.

    Is it possible to get result even if a single word matches instead of full words matching?

    opened by Pulkit-Sharma 3
  • expose metadata also in .filter() results

    expose metadata also in .filter() results

    Currently when using .search() you can access the metadata of each searchresult using result.meta['xxxx'] or result.meta.xxxx.

    When using .filter() on en existing queryset, this metadata is not exposed. Would be helpful to access the metadata here as it could contain data not available in the queryset models or the result of some expensive calculation performed during indexing.

    opened by valentijnscholten 3
Releases(release-1.6.2)
Owner
Dave Hall
Experienced Python, Rust and Typescript developer. Equally comfortable in the cloud, or down to the metal on embedded hardware.
Dave Hall
django-quill-editor makes Quill.js easy to use on Django Forms and admin sites

django-quill-editor django-quill-editor makes Quill.js easy to use on Django Forms and admin sites No configuration required for static files! The ent

lhy 138 Nov 9, 2022
TinyApp - A Python (Django) Full Stack Application for shortening URLs

TinyApp A Python (Django) Full Stack Application for shortening URLs. How to sta

Li Deng 1 Jan 23, 2022
Django-Text-to-HTML-converter - The simple Text to HTML Converter using Django framework

Django-Text-to-HTML-converter This is the simple Text to HTML Converter using Dj

Nikit Singh Kanyal 6 Oct 9, 2022
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Nov 21, 2022
A Django application that provides country choices for use with forms, flag icons static files, and a country field for models.

Django Countries A Django application that provides country choices for use with forms, flag icons static files, and a country field for models. Insta

Chris Beaven 1.2k Nov 17, 2022
🏭 An easy-to-use implementation of Creation Methods for Django, backed by Faker.

Django-fakery An easy-to-use implementation of Creation Methods (aka Object Factory) for Django, backed by Faker. django_fakery will try to guess the

Flavio Curella 93 Oct 12, 2022
django Filer is a file management application for django that makes handling of files and images a breeze.

django Filer is a file management application for django that makes handling of files and images a breeze.

django CMS Association 1.6k Nov 17, 2022
Use Database URLs in your Django Application.

DJ-Database-URL This simple Django utility allows you to utilize the 12factor inspired DATABASE_URL environment variable to configure your Django appl

Jacob Kaplan-Moss 1.3k Nov 18, 2022
Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application.

Django-environ django-environ allows you to use Twelve-factor methodology to configure your Django application with environment variables. import envi

Daniele Faraglia 2.7k Nov 24, 2022
Rosetta is a Django application that eases the translation process of your Django projects

Rosetta Rosetta is a Django application that facilitates the translation process of your Django projects. Because it doesn't export any models, Rosett

Marco Bonetti 903 Nov 17, 2022
django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project. Inspired in the dashboard framework Dashing

django-dashing django-dashing is a customisable, modular dashboard application framework for Django to visualize interesting data about your project.

talPor Solutions 699 Nov 14, 2022
Wagtail - Vue - Django : The initial environment of full-stack local dev web app with wagtail and vue

Wagtail - Vue - Django : The initial environment of full-stack local dev web app with wagtail and vue. A demo to show how to use .vue files inside django app.

Quang PHAM 2 Oct 20, 2022
Full featured redis cache backend for Django.

Redis cache backend for Django This is a Jazzband project. By contributing you agree to abide by the Contributor Code of Conduct and follow the guidel

Jazzband 2.5k Nov 18, 2022
Dashboad Full Stack utilizando o Django.

Dashboard FullStack completa Projeto finalizado | Informações Cadastro de cliente Menu interatico mostrando quantidade de pessoas bloqueadas, liberada

Lucas Silva 1 Dec 15, 2021
Full-featured django project start tool.

django-start-tool Introduction django-start-tool is a full-featured replacement for django-admin startproject which provides cli for creating the same

Georgy Gnezdilov 0 Aug 30, 2022
A simple Blog Using Django Framework and Used IBM Cloud Services for Text Analysis and Text to Speech

ElhamBlog Cloud Computing Course first assignment. A simple Blog Using Django Framework and Used IBM Cloud Services for Text Analysis and Text to Spee

Elham Razi 6 Mar 9, 2022
Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project

Django URL Shortener Django URL Shortener is a Django app to to include URL Shortening feature in your Django Project Install this package to your Dja

Rishav Sinha 4 Nov 18, 2021
Py-instant-search-redis - Source code example for how to build an instant search with redis in python

py-instant-search-redis Source code example for how to build an instant search (

Giap Le 4 Feb 17, 2022
Comparing Database performance with Django ORM

Comparing Database performance with Django ORM Postgresql MySQL MariaDB SQLite Comparing database operation performance using django ORM. PostgreSQL v

Sarath ak 21 Nov 14, 2022