Django

Open Permission access custom for Django Rest Framework

21 Mar , 2016  

When we need to open access for API Django-restframework, we can do it by extending the permission class.
Here is some example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class PublicUserPermissions(permissions.BasePermission):
    """
    Granting public access permissions
    """

    def has_object_permission(self, request, view, obj):

        # Allow get requests for all
        if request.method == 'GET':
            return True
        else:
            return request.user == obj


class SomeViewSet(viewsets.ModelViewSet):
    """
    API to view Some dataset
    """
    model = Some
    queryset = model.objects.all()
    permission_classes = (PublicUserPermissions, )

Django

Solve integrity error duplicate key in Django PostgreSQL

25 Sep , 2015  

This error caused by we’re using database from copy / clone database. The sequences will be mixed-up.
To solved this, just follow this way :

1
2
python manage.py sqlsequencereset <app-name> > app.sql
psql -U username -d database -a -f < app.sql

Then your problem shall gone!

Django

Setup Ubuntu Server in Softlayer for Django

10 Jul , 2015  

Here are a quick step to setup Ubuntu server in Softlayer for Django

1. Install depedencies

1
2
3
4
apt-get install python-software-properties software-properties-common
add-apt-repository ppa:webupd8team/java
apt-get update
sudo apt-get install oracle-java7-installer

2. Install UWSGI, Python, PostgreSQL and other modules

1
sudo apt-get install libpq-dev python-dev python-software-properties postgresql postgresql-contrib nginx git zip unzip build-essential python nmap libxslt1-dev python-pip imagemagick uwsgi uwsgi-plugin-python nmap

3. Another modules

1
sudo apt-get install git-core curl openssl libssl-dev pkg-config python-dev libxml2 libxml2-dev libxslt1-dev libbz2-dev libssl-dev p7zip-full unzip unace unp bzip2 gzip patch subversion git libmysqlclient-dev libmysqlclient-dev libmysqlclient18 php5 php5-mysql mysql-server

4. Setup UWSGI and NGINX

Django

JqGrid inline editing integration with DJango send csrf token

3 Apr , 2015  

Here is a quick snippet to send csrf_token in POST data from inline edit JqGrid to Django:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var tableGrid = $(selector).jqGrid({
   ....
   onSelectRow: function(id){
         if(id && id!==lastSel){
            $(selector).restoreRow(lastSel);
            lastSel=id;
         }

         var editparameters = {
            extraparam: {csrfmiddlewaretoken: $('.token-data').data('token')},
            keys: true,
          };
         $(selector).jqGrid('editRow', id, editparameters);

    }
};

Django

Handle error form.save() with model validation

2 Apr , 2015  

Here is a quick snippet to avoid form.save() error because model validation :

1
2
3
4
5
6
7
8
# handle form save with model validationerror
# http://stackoverflow.com/questions/8771029/django-raise-a-validation-error-in-a-models-save-method
try:
    form.save()
except ValidationError, e:
    form._errors = {}
    for _, v in e.message_dict.items():
        form._errors.setdefault(NON_FIELD_ERRORS, []).extend(v)

Django,Javascript

JqGrid delete multiple select rows

1 Apr , 2015  

There is an issue if we delete rows using :

1
2
3
4
5
6
7
8
9
10
// Get all selected row
var rows = $(selector).jqGrid("getGridParam", "selarrrow");
console.log(rows);

// Iterate and delete
for (var i in rows) {
      console.log(i);
      console.log(rows[i]);
      $(selector).jqGrid('delRowData', rows[i]);
}

Only a few records will deleted.

The solution :

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * Delete data button handler
 * There is a bug if we delete by forloop, solution
 * http://www.trirand.com/blog/?page_id=393/bugs/delrowdata-bug-on-grid-with-multiselect
 */
$("a.delete-data").click(function(e) {
    e.preventDefault();

    var rowids = $(selector).jqGrid('getGridParam', 'selarrrow');
    for (var i = rowids.length - 1; i >= 0; i--) {
        $(selector).jqGrid('delRowData', rowids[i]);
    }
});

Django

Save django model with dictionaries

29 Mar , 2015  

Beware when queryset filter update() because it will pass model validation. Here is some example save model with dictionaries :

1
2
3
4
5
6
7
8
9
10
for k, v in account.items():
    setattr(instance, k, v)

try:
    instance.save()
except Exception, e:
    raise ValidationError(e)
else:
    updated += 1
    # print account

Django

Convert boolean True and False field value in Django Rest Framework

29 Mar , 2015  

Here is a quick snippet to convert boolean True / False in DRF Serializer:

1
2
3
4
5
6
is_finish = serializers.SerializerMethodField()

def get_is_finish(self, obj):
    if obj.is_finish:
        return "Selesai"
    return "Progress"

Django

Modify object data by write Custom Renderer in Django Rest Framework

29 Mar , 2015  

When we need to modify object or results from DRF / Django Rest Framework, all we need just write a custom JSON Renderer like below :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class JGridJSONRenderer(renderers.JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        new_rows = []

        # Name the object list
        for obj in data['rows']:
            obj = dict(obj)
            new_rows.append({'id': obj['id'], 'cell': obj})

        data['rows'] = new_rows
        response_data = data
        response = super(JGridJSONRenderer, self).render(response_data, accepted_media_type, renderer_context)

        return response

Django

Django unit test formset

1 Mar , 2015  

When testing page that contains formset in Django using unit test, we may encounter :

1
ValidationError: [u'ManagementForm data is missing or has been tampered with']

This is happend because we POST data without required FORMSET hidden value in form. To solve this issue, inspect element on your formset and insert hidden value in payload data.

Example :

1
2
<input id="id_firstformaset-MIN_NUM_FORMS" name="firstformaset-MIN_NUM_FORMS" type="hidden" value="0">
...

And put this in our payload:

1
2
3
4
5
6
7
8
        self.correct = {
            'name': 'TESTDATA',
            'gender': self.model.FEMALE_STATUS,
            'firstformaset-TOTAL_FORMS': 1,
            'firstformaset-INITIAL_FORMS': 0,
            'firstformaset-MIN_NUM_FORMS': 0,
            'firstformaset-MAX_NUM_FORMS': 1,
        }

Django

Django check related model and check field if exists in model

19 Feb , 2015  

We can check if the field is related model in Model by :

1
model._meta.get_field("name_of_field").get_internal_type() == "ForeignKey"

Then we can check if the field name is exists in model by :

1
model._meta.get_field_by_name(_name)

Some example code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if self.model._meta.get_field(field_name).get_internal_type() == "ForeignKey":
    # get related model
    # http://stackoverflow.com/questions/10347210/django-foreign-key-get-related-model
    related_model = self.model._meta.get_field(field_name).rel.to

    # Checking the default field for related model
    check_name = None
    for _name in ['name', 'code']:
        try:
            related_model._meta.get_field_by_name(_name)
        except FieldDoesNotExist:
            pass
        else:
            check_name = _name
            break

Django

Your branch and ‘origin/master’ have diverged, and have 1 and 1 different commit each, respectively.

15 Jan , 2015  

I got this problem:

1
2
3
4
5
6
λ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean

Solution

1
2
λ git reset --hard origin/master
HEAD is now at 63813ef fix localdb

, ,

Django

Django 1.7 reset migration solved

12 Jan , 2015  

Here is a quickstep to reset database migration in Django 1.7 :

1
2
python manage.py makemigrations --empty your_app
python manage.py makemigrations your_app

Django

Git rollback last commit in remote

12 Jan , 2015  

To rollback last commit :

1
2
git reset HEAD~1 --hard
git push -f

Django

Git checkout track from remote branch

12 Jan , 2015  

Let’s say somebody already push their branch in remote called “finances”. We want to fetch and working on this branch from our local. So, the solution :

1
2
3
4
5
git fetch --all

Fetching origin
From github.com:polatic/vasham-erp
 * [new branch]      finance    -> origin/finance

Then, we checkout with tracking

1
2
3
git checkout -t origin/finance
Branch finance set up to track remote branch finance from origin.
Switched to a new branch 'finance'

Now ready for working :

1
git checkout finance

Django

Accelerate django development server with django-devserver

9 Jan , 2015  

As we know what django development server running on single thread. This is make development a bit slow. There is some alternative, by using django-devserver

Here is the quickstep:

1. Install the app

1
pip install git+git://github.com/nealtodd/django-devserver

2. Edit your local_settings.py

1
2
3
4
5
INSTALLED_APPS =  ('devserver',) + INSTALLED_APPS

MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + (
   'devserver.middleware.DevServerMiddleware',
)

3. Then run

1
python manage.py runserver

Django

Ubuntu Check Memory Usage by Process

9 Jan , 2015  

Here is a quick snippet for check memory usage by process :

1
ps aux | sort -rn -k 5,6 | less

Django

Solve Django Filter queryset result duplicates with Pagination

5 Jan , 2015  

When we filter using multiple filter and mixed with django pagination, somehow the results are duplicates. This is incorrect. Apparently, looking at the source code https://github.com/alex/django-filter/blob/master/django_filters/filters.py#L105, I found this line:

1
2
3
4
q = Q()
for v in value:
    q |= Q(**{self.name: v})
return qs.filter(q).distinct()

By default, django-filter not using “AND” condition and that’s why it’s showing duplicates.

To fix this, then we can use distinct when passing object_list in paginator, example:

1
results = paginator(request, PlanningOrder, 'farmseason', object_list.qs.distinct())

Django

Setup Django and Timezone follow server datetime (Ubuntu)

5 Jan , 2015  

Here is quickfix to setup Django working with server timezone.

1. Set Server Timezone

Check by :

1
2
date
Mon Jan  5 10:54:38 WIB 2015

If this not correct or you want to change server timezone, then edit “/etc/timezone”

1
Asia/Jakarta

Then do :

1
2
sudo dpkg-reconfigure --frontend noninteractive tzdata
date

Now you should see the updated server time.

2. Django
We need to edit settings.py add edit this line:

1
2
TIME_ZONE = 'Asia/Jakarta'
USE_TZ = True

Restart your django server (uwsgi or wsgi) and do testing

Django

Django django-admin.py startproject ImportError

27 Dec , 2014  

Suddenly i got this error in Windows when trying to start a new Django project :

1
django-admin.py startproject ImportError: No module named django.core

The solution :

1
python C:\Python27\Scripts\django-admin.py startproject example

Django

Celery as daemon service in Ubuntu for production

11 Dec , 2014  

Here is a quickstep to set Celery as daemon in Ubuntu 14.04 for production:

Create file “/etc/init.d/celeryd” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
#!/bin/sh -e
# ============================================
#  celeryd - Starts the Celery worker daemon.
# ============================================
#
# :Usage: /etc/init.d/celeryd {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celeryd
#
# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#generic-init-scripts


### BEGIN INIT INFO
# Provides:          celeryd
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: celery task worker daemon
### END INIT INFO
#
#
# To implement separate init scripts, copy this script and give it a different
# name:
# I.e., if my new application, "little-worker" needs an init, I
# should just use:
#
#   cp /etc/init.d/celeryd /etc/init.d/little-worker
#
# You can then configure this by manipulating /etc/default/little-worker.
#
VERSION=10.1
echo "celery init v${VERSION}."
if [ $(id -u) -ne 0 ]; then
    echo "Error: This program can only be used by the root user."
    echo "       Unprivileged users must use the 'celery multi' utility, "
    echo "       or 'celery worker --detach'."
    exit 1
fi


# Can be a runlevel symlink (e.g. S02celeryd)
if [ -L "$0" ]; then
    SCRIPT_FILE=$(readlink "$0")
else
    SCRIPT_FILE="$0"
fi
SCRIPT_NAME="$(basename "$SCRIPT_FILE")"

DEFAULT_USER="celery"
DEFAULT_PID_FILE="/var/run/celery/%n.pid"
DEFAULT_LOG_FILE="/var/log/celery/%n.log"
DEFAULT_LOG_LEVEL="INFO"
DEFAULT_NODES="celery"
DEFAULT_CELERYD="-m celery worker --detach"

CELERY_DEFAULTS=${CELERY_DEFAULTS:-"/etc/default/${SCRIPT_NAME}"}

# Make sure executable configuration script is owned by root
_config_sanity() {
    local path="$1"
    local owner=$(ls -ld "$path" | awk '{print $3}')
    local iwgrp=$(ls -ld "$path" | cut -b 6)
    local iwoth=$(ls -ld "$path" | cut -b 9)

    if [ "$(id -u $owner)" != "0" ]; then
        echo "Error: Config script '$path' must be owned by root!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with mailicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change ownership of the script:"
        echo "    $ sudo chown root '$path'"
        exit 1
    fi

    if [ "$iwoth" != "-" ]; then  # S_IWOTH
        echo "Error: Config script '$path' cannot be writable by others!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with malicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change the scripts permissions:"
        echo "    $ sudo chmod 640 '$path'"
        exit 1
    fi
    if [ "$iwgrp" != "-" ]; then  # S_IWGRP
        echo "Error: Config script '$path' cannot be writable by group!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with malicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change the scripts permissions:"
        echo "    $ sudo chmod 640 '$path'"
        exit 1
    fi
}

if [ -f "$CELERY_DEFAULTS" ]; then
    _config_sanity "$CELERY_DEFAULTS"
    echo "Using config script: $CELERY_DEFAULTS"
    . "$CELERY_DEFAULTS"
fi

# Sets --app argument for CELERY_BIN
CELERY_APP_ARG=""
if [ ! -z "$CELERY_APP" ]; then
    CELERY_APP_ARG="--app=$CELERY_APP"
fi

CELERYD_USER=${CELERYD_USER:-$DEFAULT_USER}

# Set CELERY_CREATE_DIRS to always create log/pid dirs.
CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-0}
CELERY_CREATE_RUNDIR=$CELERY_CREATE_DIRS
CELERY_CREATE_LOGDIR=$CELERY_CREATE_DIRS
if [ -z "$CELERYD_PID_FILE" ]; then
    CELERYD_PID_FILE="$DEFAULT_PID_FILE"
    CELERY_CREATE_RUNDIR=1
fi
if [ -z "$CELERYD_LOG_FILE" ]; then
    CELERYD_LOG_FILE="$DEFAULT_LOG_FILE"
    CELERY_CREATE_LOGDIR=1
fi

CELERYD_LOG_LEVEL=${CELERYD_LOG_LEVEL:-${CELERYD_LOGLEVEL:-$DEFAULT_LOG_LEVEL}}
CELERY_BIN=${CELERY_BIN:-"celery"}
CELERYD_MULTI=${CELERYD_MULTI:-"$CELERY_BIN multi"}
CELERYD_NODES=${CELERYD_NODES:-$DEFAULT_NODES}

export CELERY_LOADER

if [ -n "$2" ]; then
    CELERYD_OPTS="$CELERYD_OPTS $2"
fi

CELERYD_LOG_DIR=`dirname $CELERYD_LOG_FILE`
CELERYD_PID_DIR=`dirname $CELERYD_PID_FILE`

# Extra start-stop-daemon options, like user/group.
if [ -n "$CELERYD_CHDIR" ]; then
    DAEMON_OPTS="$DAEMON_OPTS --workdir=$CELERYD_CHDIR"
fi


check_dev_null() {
    if [ ! -c /dev/null ]; then
        echo "/dev/null is not a character device!"
        exit 75  # EX_TEMPFAIL
    fi
}


maybe_die() {
    if [ $? -ne 0 ]; then
        echo "Exiting: $* (errno $?)"
        exit 77  # EX_NOPERM
    fi
}

create_default_dir() {
    if [ ! -d "$1" ]; then
        echo "- Creating default directory: '$1'"
        mkdir -p "$1"
        maybe_die "Couldn't create directory $1"
        echo "- Changing permissions of '$1' to 02755"
        chmod 02755 "$1"
        maybe_die "Couldn't change permissions for $1"
        if [ -n "$CELERYD_USER" ]; then
            echo "- Changing owner of '$1' to '$CELERYD_USER'"
            chown "$CELERYD_USER" "$1"
            maybe_die "Couldn't change owner of $1"
        fi
        if [ -n "$CELERYD_GROUP" ]; then
            echo "- Changing group of '$1' to '$CELERYD_GROUP'"
            chgrp "$CELERYD_GROUP" "$1"
            maybe_die "Couldn't change group of $1"
        fi
    fi
}


check_paths() {
    if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then
        create_default_dir "$CELERYD_LOG_DIR"
    fi
    if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then
        create_default_dir "$CELERYD_PID_DIR"
    fi
}

create_paths() {
    create_default_dir "$CELERYD_LOG_DIR"
    create_default_dir "$CELERYD_PID_DIR"
}

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"


_get_pidfiles () {
    # note: multi < 3.1.14 output to stderr, not stdout, hence the redirect.
    ${CELERYD_MULTI} expand "${CELERYD_PID_FILE}" ${CELERYD_NODES} 2>&1
}


_get_pids() {
    found_pids=0
    my_exitcode=0

    for pidfile in $(_get_pidfiles); do
        local pid=`cat "$pidfile"`
        local cleaned_pid=`echo "$pid" | sed -e 's/[^0-9]//g'`
        if [ -z "$pid" ] || [ "$cleaned_pid" != "$pid" ]; then
            echo "bad pid file ($pidfile)"
            one_failed=true
            my_exitcode=1
        else
            found_pids=1
            echo "$pid"
        fi

    if [ $found_pids -eq 0 ]; then
        echo "${SCRIPT_NAME}: All nodes down"
        exit $my_exitcode
    fi
    done
}


_chuid () {
    su "$CELERYD_USER" -c "$CELERYD_MULTI $*"
}


start_workers () {
    if [ ! -z "$CELERYD_ULIMIT" ]; then
        ulimit $CELERYD_ULIMIT
    fi
    _chuid $* start $CELERYD_NODES $DAEMON_OPTS     \
                 --pidfile="$CELERYD_PID_FILE"      \
                 --logfile="$CELERYD_LOG_FILE"      \
                 --loglevel="$CELERYD_LOG_LEVEL"    \
                 $CELERY_APP_ARG                    \
                 $CELERYD_OPTS
}


dryrun () {
    (C_FAKEFORK=1 start_workers --verbose)
}


stop_workers () {
    _chuid stopwait $CELERYD_NODES --pidfile="$CELERYD_PID_FILE"
}


restart_workers () {
    _chuid restart $CELERYD_NODES $DAEMON_OPTS      \
                   --pidfile="$CELERYD_PID_FILE"    \
                   --logfile="$CELERYD_LOG_FILE"    \
                   --loglevel="$CELERYD_LOG_LEVEL"  \
                   $CELERY_APP_ARG                  \
                   $CELERYD_OPTS
}


kill_workers() {
    _chuid kill $CELERYD_NODES --pidfile="$CELERYD_PID_FILE"
}


restart_workers_graceful () {
    echo "WARNING: Use with caution in production"
    echo "The workers will attempt to restart, but they may not be able to."
    local worker_pids=
    worker_pids=`_get_pids`
    [ "$one_failed" ] && exit 1

    for worker_pid in $worker_pids; do
        local failed=
        kill -HUP $worker_pid 2> /dev/null || failed=true
        if [ "$failed" ]; then
            echo "${SCRIPT_NAME} worker (pid $worker_pid) could not be restarted"
            one_failed=true
        else
            echo "${SCRIPT_NAME} worker (pid $worker_pid) received SIGHUP"
        fi
    done

    [ "$one_failed" ] && exit 1 || exit 0
}


check_status () {
    my_exitcode=0
    found_pids=0

    local one_failed=
    for pidfile in $(_get_pidfiles); do
        if [ ! -r $pidfile ]; then
            echo "${SCRIPT_NAME} down: no pidfiles found"
            one_failed=true
            break
        fi

        local node=`basename "$pidfile" .pid`
        local pid=`cat "$pidfile"`
        local cleaned_pid=`echo "$pid" | sed -e 's/[^0-9]//g'`
        if [ -z "$pid" ] || [ "$cleaned_pid" != "$pid" ]; then
            echo "bad pid file ($pidfile)"
            one_failed=true
        else
            local failed=
            kill -0 $pid 2> /dev/null || failed=true
            if [ "$failed" ]; then
                echo "${SCRIPT_NAME} (node $node) (pid $pid) is down, but pidfile exists!"
                one_failed=true
            else
                echo "${SCRIPT_NAME} (node $node) (pid $pid) is up..."
            fi
        fi
    done

    [ "$one_failed" ] && exit 1 || exit 0
}


case "$1" in
    start)
        check_dev_null
        check_paths
        start_workers
    ;;

    stop)
        check_dev_null
        check_paths
        stop_workers
    ;;

    reload|force-reload)
        echo "Use restart"
    ;;

    status)
        check_status
    ;;

    restart)
        check_dev_null
        check_paths
        restart_workers
    ;;

    graceful)
        check_dev_null
        restart_workers_graceful
    ;;

    kill)
        check_dev_null
        kill_workers
    ;;

    dryrun)
        check_dev_null
        dryrun
    ;;

    try-restart)
        check_dev_null
        check_paths
        restart_workers
    ;;

    create-paths)
        check_dev_null
        create_paths
    ;;

    check-paths)
        check_dev_null
        check_paths
    ;;

    *)
        echo "Usage: /etc/init.d/${SCRIPT_NAME} {start|stop|restart|graceful|kill|dryrun|create-paths}"
        exit 64  # EX_USAGE
    ;;
esac

exit 0

Now make it executable :

1
sudo chmod a+x /etc/init.d/celeryd

Then create “/etc/default/celeryd” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# App instance to use
# comment out this line if you don't use an app
CELERY_APP="yourprojectname"
# Where to chdir at start.
CELERYD_CHDIR="/path/to/your/project"

# Names of nodes to start
#   most will only start one node:
CELERYD_NODES="worker1"
#   but you can also start multiple and configure settings
#   for each in CELERYD_OPTS (see `celery multi --help` for examples).
CELERYD_NODES="worker"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# %N will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"

# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists, e.g. nobody).
CELERYD_USER="ubuntu"
CELERYD_GROUP="ubuntu"

# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1

Then, we need to chown required folder :

1
2
sudo chown ubuntu -R /var/run/celery/
sudo chown ubuntu -R /var/log/celery

Now we ready to start the services by

1
sudo service celeryd start

You can see the log at “/var/log/celery/worker.log”

For Celerybeat, create file “/etc/init.d/celerybeat” :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
#!/bin/bash
# =========================================================
#  celerybeat - Starts the Celery periodic task scheduler.
# =========================================================
#
# :Usage: /etc/init.d/celerybeat {start|stop|force-reload|restart|try-restart|status}
# :Configuration file: /etc/default/celerybeat or /etc/default/celeryd
#
# See http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#generic-init-scripts

### BEGIN INIT INFO
# Provides:          celerybeat
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: celery periodic task scheduler
### END INIT INFO

# Cannot use set -e/bash -e since the kill -0 command will abort
# abnormally in the absence of a valid process ID.
#set -e
VERSION=10.1
echo "celery init v${VERSION}."

if [ $(id -u) -ne 0 ]; then
    echo "Error: This program can only be used by the root user."
    echo "       Unpriviliged users must use 'celery beat --detach'"
    exit 1
fi


# May be a runlevel symlink (e.g. S02celeryd)
if [ -L "$0" ]; then
    SCRIPT_FILE=$(readlink "$0")
else
    SCRIPT_FILE="$0"
fi
SCRIPT_NAME="$(basename "$SCRIPT_FILE")"

# /etc/init.d/celerybeat: start and stop the celery periodic task scheduler daemon.

# Make sure executable configuration script is owned by root
_config_sanity() {
    local path="$1"
    local owner=$(ls -ld "$path" | awk '{print $3}')
    local iwgrp=$(ls -ld "$path" | cut -b 6)
    local iwoth=$(ls -ld "$path" | cut -b 9)

    if [ "$(id -u $owner)" != "0" ]; then
        echo "Error: Config script '$path' must be owned by root!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with mailicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change ownership of the script:"
        echo "    $ sudo chown root '$path'"
        exit 1
    fi

    if [ "$iwoth" != "-" ]; then  # S_IWOTH
        echo "Error: Config script '$path' cannot be writable by others!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with malicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change the scripts permissions:"
        echo "    $ sudo chmod 640 '$path'"
        exit 1
    fi
    if [ "$iwgrp" != "-" ]; then  # S_IWGRP
        echo "Error: Config script '$path' cannot be writable by group!"
        echo
        echo "Resolution:"
        echo "Review the file carefully and make sure it has not been "
        echo "modified with malicious intent.  When sure the "
        echo "script is safe to execute with superuser privileges "
        echo "you can change the scripts permissions:"
        echo "    $ sudo chmod 640 '$path'"
        exit 1
    fi
}

scripts=""

if test -f /etc/default/celeryd; then
    scripts="/etc/default/celeryd"
    _config_sanity /etc/default/celeryd
    . /etc/default/celeryd
fi

EXTRA_CONFIG="/etc/default/${SCRIPT_NAME}"
if test -f "$EXTRA_CONFIG"; then
    scripts="$scripts, $EXTRA_CONFIG"
    _config_sanity "$EXTRA_CONFIG"
    . "$EXTRA_CONFIG"
fi

echo "Using configuration: $scripts"

CELERY_BIN=${CELERY_BIN:-"celery"}
DEFAULT_USER="celery"
DEFAULT_PID_FILE="/var/run/celery/beat.pid"
DEFAULT_LOG_FILE="/var/log/celery/beat.log"
DEFAULT_LOG_LEVEL="INFO"
DEFAULT_CELERYBEAT="$CELERY_BIN beat"

CELERYBEAT=${CELERYBEAT:-$DEFAULT_CELERYBEAT}
CELERYBEAT_LOG_LEVEL=${CELERYBEAT_LOG_LEVEL:-${CELERYBEAT_LOGLEVEL:-$DEFAULT_LOG_LEVEL}}

# Sets --app argument for CELERY_BIN
CELERY_APP_ARG=""
if [ ! -z "$CELERY_APP" ]; then
    CELERY_APP_ARG="--app=$CELERY_APP"
fi

CELERYBEAT_USER=${CELERYBEAT_USER:-${CELERYD_USER:-$DEFAULT_USER}}

# Set CELERY_CREATE_DIRS to always create log/pid dirs.
CELERY_CREATE_DIRS=${CELERY_CREATE_DIRS:-0}
CELERY_CREATE_RUNDIR=$CELERY_CREATE_DIRS
CELERY_CREATE_LOGDIR=$CELERY_CREATE_DIRS
if [ -z "$CELERYBEAT_PID_FILE" ]; then
    CELERYBEAT_PID_FILE="$DEFAULT_PID_FILE"
    CELERY_CREATE_RUNDIR=1
fi
if [ -z "$CELERYBEAT_LOG_FILE" ]; then
    CELERYBEAT_LOG_FILE="$DEFAULT_LOG_FILE"
    CELERY_CREATE_LOGDIR=1
fi

export CELERY_LOADER

CELERYBEAT_OPTS="$CELERYBEAT_OPTS -f $CELERYBEAT_LOG_FILE -l $CELERYBEAT_LOG_LEVEL"

if [ -n "$2" ]; then
    CELERYBEAT_OPTS="$CELERYBEAT_OPTS $2"
fi

CELERYBEAT_LOG_DIR=`dirname $CELERYBEAT_LOG_FILE`
CELERYBEAT_PID_DIR=`dirname $CELERYBEAT_PID_FILE`

# Extra start-stop-daemon options, like user/group.

CELERYBEAT_CHDIR=${CELERYBEAT_CHDIR:-$CELERYD_CHDIR}
if [ -n "$CELERYBEAT_CHDIR" ]; then
    DAEMON_OPTS="$DAEMON_OPTS --workdir=$CELERYBEAT_CHDIR"
fi


export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"

check_dev_null() {
    if [ ! -c /dev/null ]; then
        echo "/dev/null is not a character device!"
        exit 75  # EX_TEMPFAIL
    fi
}

maybe_die() {
    if [ $? -ne 0 ]; then
        echo "Exiting: $*"
        exit 77  # EX_NOPERM
    fi
}

create_default_dir() {
    if [ ! -d "$1" ]; then
        echo "- Creating default directory: '$1'"
        mkdir -p "$1"
        maybe_die "Couldn't create directory $1"
        echo "- Changing permissions of '$1' to 02755"
        chmod 02755 "$1"
        maybe_die "Couldn't change permissions for $1"
        if [ -n "$CELERYBEAT_USER" ]; then
            echo "- Changing owner of '$1' to '$CELERYBEAT_USER'"
            chown "$CELERYBEAT_USER" "$1"
            maybe_die "Couldn't change owner of $1"
        fi
        if [ -n "$CELERYBEAT_GROUP" ]; then
            echo "- Changing group of '$1' to '$CELERYBEAT_GROUP'"
            chgrp "$CELERYBEAT_GROUP" "$1"
            maybe_die "Couldn't change group of $1"
        fi
    fi
}

check_paths() {
    if [ $CELERY_CREATE_LOGDIR -eq 1 ]; then
        create_default_dir "$CELERYBEAT_LOG_DIR"
    fi
    if [ $CELERY_CREATE_RUNDIR -eq 1 ]; then
        create_default_dir "$CELERYBEAT_PID_DIR"
    fi
}


create_paths () {
    create_default_dir "$CELERYBEAT_LOG_DIR"
    create_default_dir "$CELERYBEAT_PID_DIR"
}


wait_pid () {
    pid=$1
    forever=1
    i=0
    while [ $forever -gt 0 ]; do
        kill -0 $pid 1>/dev/null 2>&1
        if [ $? -eq 1 ]; then
            echo "OK"
            forever=0
        else
            kill -TERM "$pid"
            i=$((i + 1))
            if [ $i -gt 60 ]; then
                echo "ERROR"
                echo "Timed out while stopping (30s)"
                forever=0
            else
                sleep 0.5
            fi
        fi
    done
}


stop_beat () {
    echo -n "Stopping ${SCRIPT_NAME}... "
    if [ -f "$CELERYBEAT_PID_FILE" ]; then
        wait_pid $(cat "$CELERYBEAT_PID_FILE")
    else
        echo "NOT RUNNING"
    fi
}

_chuid () {
    su "$CELERYBEAT_USER" -c "$CELERYBEAT $*"
}

start_beat () {
    echo "Starting ${SCRIPT_NAME}..."
    _chuid $CELERY_APP_ARG $CELERYBEAT_OPTS $DAEMON_OPTS --detach \
                --pidfile="$CELERYBEAT_PID_FILE"
}


check_status () {
    local failed=
    local pid_file=$CELERYBEAT_PID_FILE
    if [ ! -e $pid_file ]; then
        echo "${SCRIPT_NAME} is up: no pid file found"
        failed=true
    elif [ ! -r $pid_file ]; then
        echo "${SCRIPT_NAME} is in unknown state, user cannot read pid file."
        failed=true
    else
        local pid=`cat "$pid_file"`
        local cleaned_pid=`echo "$pid" | sed -e 's/[^0-9]//g'`
        if [ -z "$pid" ] || [ "$cleaned_pid" != "$pid" ]; then
            echo "${SCRIPT_NAME}: bad pid file ($pid_file)"
            failed=true
        else
            local failed=
            kill -0 $pid 2> /dev/null || failed=true
            if [ "$failed" ]; then
                echo "${SCRIPT_NAME} (pid $pid) is down, but pid file exists!"
                failed=true
            else
                echo "${SCRIPT_NAME} (pid $pid) is up..."
            fi
        fi
    fi

    [ "$failed" ] && exit 1 || exit 0
}


case "$1" in
    start)
        check_dev_null
        check_paths
        start_beat
    ;;
    stop)
        check_paths
        stop_beat
    ;;
    reload|force-reload)
        echo "Use start+stop"
    ;;
    status)
        check_status
    ;;
    restart)
        echo "Restarting celery periodic task scheduler"
        check_paths
        stop_beat
        check_dev_null
        start_beat
    ;;
    create-paths)
        check_dev_null
        create_paths
    ;;
    check-paths)
        check_dev_null
        check_paths
    ;;
    *)
        echo "Usage: /etc/init.d/${SCRIPT_NAME} {start|stop|restart|create-paths|status}"
        exit 64  # EX_USAGE
    ;;
esac

exit 0

Then make it executable by “sudo chmod a+x /etc/init.d/celerybeat”.

Now, setup configuration by create file “/etc/default/celerybeat” :

1
2
3
4
5
6
7
8
# Where to chdir at start.
CELERYBEAT_CHDIR="/project/path/"

# Extra arguments to celerybeat
CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"

# Name of the celery config module.#
CELERY_CONFIG_MODULE="celeryconfig"

And start celerybeat by :

1
sudo service celerybeat start

Django

Install Django in Windows 8 / 7

9 Dec , 2014  

Here is quick step to setup Django in windows box :

1. Install Python
Please download https://www.python.org/ftp/python/2.7.7/python-2.7.7.msi.

2. Install Setuptools
http://www.lfd.uci.edu/~gohlke/pythonlibs/4jci5y59/setuptools-5.8.win32-py2.7.exe

3. Install PIP
http://www.lfd.uci.edu/~gohlke/pythonlibs/4jci5y59/pip-1.5.6.win32-py2.7.exe

4.Don’t forget to set global environment variables (depend on your Python path installation)
In PATH, please add :

1
C:\Python27\;C:\Python27\Scripts;C:\Python27\Lib\site-packages\django\bin;

5. Install Django

1
pip install django

6. Create new django project

1
python C:\Python27\Scripts\django-admin.py startproject yourproject

Django

Configure Django Celery, RabbitMQ in Windows and periodic task

1 Dec , 2014  

Here is guide to setup Django, Celery, RabbitMQ in Windows and running periodic task.

1. Install RabbitMQ
Go to http://www.rabbitmq.com/download.html, install and check if the services already running

2. Setup celery in your Django Project
Install django-celery modules

1
pip install django-celery

3. Example configuration for periodic task
In this example, i create tasks.py in app “schedules”:

1
2
3
4
5
6
7
8
9
10
11
12
from celery import Celery

app = Celery()

@app.task()  # Celery will ignore results and save memory
def update_student():
    """
    Generate Student data every minutes
    """

    updating_student_database()
    print("this executed!")

In Project/project (where settings.py located), create celery_configuration.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

app = Celery('myproject')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

app.conf.update(
    CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
    CELERY_TASK_RESULT_EXPIRES=3600,
)

if __name__ == '__main__':
    app.start()

Then, last time in settings.py:

1
2
3
4
5
6
7
# Define which task that will executed in periodic task
CELERYBEAT_SCHEDULE = {
    'every-minute': {
        'task': 'schedules.tasks.update_student',
        'schedule': timedelta(seconds=10),
    },
}

Don’t forget to update your __init__.py (located in same folder with settings.py)

1
from myproject.celery_configuration import app as celery_app

Then, we just need to run “celeryd” and “celerybeat” to make periodic task working

1
2
python manage.py celery beat --app=myproject
python manage.py celeryd -l INFO

,

Django

Setup Queue in Django using Celery and RabbitMQ

23 Nov , 2014  

I’m using Ubuntu for setup queue in Django using celery and rabbitmq. Go to console and we need to install rabbitmq at first:

1. RabbitMQ

1
2
3
4
wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc
sudo apt-get update
sudo apt-get install rabbitmq-server

To adjust system limits (in particular the number of open file handles), edit the file /etc/default/rabbitmq-server to invoke ulimit when the service is started, for example:

1
ulimit -n 1024

Will set the maximum number of file open handles for the service process to 1024 (the default).

Invoke rabbitmqctl stop to stop the server.
Invoke rabbitmqctl status to check whether it is running.

Some detail tutorial
http://docs.dotcloud.com/tutorials/python/django-celery/
https://github.com/ServiceStack/rabbitmq-windows

2. Django Celery

1
pip install django-celery

Then add “djcelery” in INSTALLED_APPS. Then do migration by :

1
python manage.py migrate djcelery

,

Django

TypeError: __init__() got an unexpected keyword argument ‘preserve_default’

12 Nov , 2014  

Quickfix to solve ;

1
2
3
4
5
6
7
8
    migration_module = import_module("%s.%s" % (module_name, migration_name))
  File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "D:\Python\vasham\dashboards\migrations\0004_auto_20141112_1644.py", line 7, in <module>
    class Migration(migrations.Migration):
  File "D:\Python\vasham\dashboards\migrations\0004_auto_20141112_1644.py", line 18, in Migration
    preserve_default=True,
TypeError: __init__() got an unexpected keyword argument 'preserve_default'

Is

1
pip install django --upgrade

Django

No python application found, check your startup logs for errors

25 Oct , 2014  

This errors occured in setup Django + UWSGI in Ubuntu 14.04. The reason because the uwsgi from aptitude is broken.

1
2
3
4
Sat Oct 25 12:38:28 2014 - --- no python application found, check your startup logs for errors ---
[pid: 5556|app: -1|req: -1/1] 36.78.164.116 () {42 vars in 681 bytes} [Sat Oct 25 12:38:28 2014] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 1 headers in 57 bytes (0 switches on core 0)
Sat Oct 25 12:38:29 2014 - --- no python application found, check your startup logs for errors ---
[pid: 5551|app: -1|req: -1/2] 36.78.164.116 () {42 vars in 681 bytes} [Sat Oct 25 12:38:29 2014] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 1 headers in 57 bytes (0 switches on core 0)

Here is the solution

1
2
3
4
sudo pip install uwsgi
cd /usr/bin
sudo mv uwsgi uwsgi-old
sudo ln -s /usr/local/bin/uwsgi uwsgi

Make sure you’re using right .ini wsgi :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[uwsgi]
# enable master process manager
master = true

# spawn 2 uWSGI worker processes
workers = 2

# bind to UNIX socket at /run/uwsgi/<confnamespace>/<confname>/socket
socket = /tmp/dapurhemat.sock

# set mode of created UNIX socket
chmod-socket = 666

# place timestamps into log
log-date = true

# user identifier of uWSGI processes
uid = root

# group identifier of uWSGI processes
gid = root

; define variables to use in this script
project = dapurhemat

; number of worker processes
processes = 8

; plugins=python
; project-level logging to the logs/ folder

; django >= 1.4 project
chdir = /var/yodi/dapurhemat
wsgi-file=/var/yodi/dapurhemat/dapurhemat/wsgi.py

virtualenv=/root/.virtualenvs/dapurhemat

; run master process as root
enable-threads = true

vacuum = true
env = DJANGO_SETTINGS_MODULE=kargo.settings
pidfile2 = /tmp/dapurhemat.pid

You can test your app first with “python manage.py runserveR” before integrate with uwsgi

We also can check by manually running the “.ini” configuration:

1
uwsgi --ini yourfile.ini

If you got error like below:

1
2016/05/29 13:07:32 [error] 5589#0: *4 upstream prematurely closed connection while reading response header from upstream, client: 202.62.17.132, server: dapurhemat.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/tmp/dapurhemat.sock:", host: "dapurhemat.com"

Then, please install :

1
apt-get install uwsgi uwsgi-plugin-python

,

Django

Django UWSGI Ubuntu 14.04 in Amazon EC2

25 Oct , 2014  

Here is complete tutorial installing and setup django for production in EC2 Ubuntu 14.04. First, we need to login into EC2, setup a new instance and launch. Then login SSH and ready for action.

1. Always get latest updates

1
sudo apt-get update && sudo apt-get upgrade -y

2. Install Java

1
2
3
4
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

3. Install Python and PostgreSQL

1
sudo apt-get install libpq-dev python-dev postgresql postgresql-contrib nginx git zip unzip build-essential python libxslt1-dev python-pip libmysqlclient-dev imagemagick uwsgi uwsgi-plugin-python uwsgi-plugin-python

4. Setup Django UWSGI

1
2
cd /etc/uwsgi/apps-enabled
sudo vim yourapp.ini

This is some example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[uwsgi]
# enable master process manager
master = true

# spawn 2 uWSGI worker processes
workers = 4

# bind to UNIX socket at /run/uwsgi/<confnamespace>/<confname>/socket
socket = /tmp/myproject.sock

# set mode of created UNIX socket
chmod-socket = 666

# place timestamps into log
log-date = true

# user identifier of uWSGI processes
uid = ubuntu

# group identifier of uWSGI processes
gid = ubuntu

; define variables to use in this script
project = myproject

; number of worker processes
processes = 2

plugins=python
; project-level logging to the logs/ folder

; django >= 1.4 project
chdir = /var/myproject
wsgi-file=/var/myproject/myproject_settings_folder/wsgi.py

; run master process as root
enable-threads = true
processes = 10

vacuum = true
;env = DJANGO_SETTINGS_MODULE=djtest.settings
;module = polatic.wsgi:application
env = DJANGO_SETTINGS_MODULE=myproject.settings
pidfile2 = /tmp/vasham.pid
;harakiri = 20 # respawn processes taking more than 20 seconds
;max-requests = 5000 # respawn processes after serving 5000 requests

REMEMBER! in Ubuntu 14.04, UWSGI WILL NOT WORKING!

Here is the quickfix:

1
2
3
4
sudo pip install uwsgi
cd /usr/bin
sudo mv uwsgi uwsgi-old
sudo ln -s /usr/local/bin/uwsgi uwsgi

4. Setup NGINX

Create a new file in “/etc/nginx/sites-enabled”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
server {                                                                  
    listen 80;                                                            
    server_name yourdomain;                                    
    access_log /var/log/nginx/access.log;                                  
    error_log /var/log/nginx/error.log;                                    
    root /yourpath/yourapp;                                                    
                                                                           
    client_body_timeout 646000;                                            
    client_header_timeout 646000;                                          
    send_timeout 64600;                                                    
    client_max_body_size 30m;                                              
    keepalive_timeout 63000;                                              
    proxy_connect_timeout 66000;                                          
    proxy_send_timeout 66000;                                              
    proxy_read_timeout 66000;                                              
                                                                           
    index  index.php index.html index.htm;                                
                                                                           
    # Check if a file exists at /var/www/domain/ for the incoming request.
    # If it doesn't proxy to Apache/Django.                                
    try_files $uri @django;                                                
                                                                           
    location /media  {                                                    
         alias /yourpath/yourapp/media;                                        
    }                                                                      
                                                                           
    location /static {                                                    
         alias /yourpath/yourapp/static;                                        
    }                                                                      
                                                                           
    location / {                                                          
        uwsgi_pass unix:/tmp/yourapp.sock;                          
        uwsgi_read_timeout 60000;                                          
        include uwsgi_params;                                              
    }                                                                      
                                                                           
}

5. Setup PostgreSQL

Edit file “/etc/postgresql/9.3/main/pg_hba.conf”. Edit this line and change it “trust” for enable access psql without password from server.

1
2
3
4
5
6
7
# Database administrative login by Unix domain socket
local   all             postgres                                trust

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

To create new user :

1
2
sudo -i -u postgres
createuser --interactive
1
2
3
4
5
psql
create database YOUR_DATABASE;
ALTER USER your_user WITH PASSWORD 'somepassword';
GRANT ALL PRIVILEGES ON DATABASE your_database TO your user;
\q

Done! Now we good to go!

Django

Remove dash or empty label in Django Form ForeignKey

22 Oct , 2014  

To remove dash or empty selection in form foreignkey Django, we just need to declare “empty_label=None” in the form.
Here is the example :

1
2
3
4
instance = forms.ModelChoiceField(empty_label=None,
                queryset=Instance.objects.exclude(
                   ...some queryset..
                )

Django

Django coercing to Unicode: need string or buffer, NoneType found

20 Oct , 2014  

This errors in Django ‘coercing to Unicode: need string or buffer, NoneType found’ take me 20 minutes to solved.
Look at our example models :

1
2
3
4
5
class Insurance(models.Model):
    code = models.CharField(max_length=255, blank=True, null=True, default=None, unique=True)

class Person(models.Model):
    insurance = models.ForeignKey(Insurance)

When insurance value is None, then you will get error :

1
coercing to Unicode: need string or buffer, NoneType found

The solution ?

If we want to still showing “None” value, then :

1
2
3
4
5
class Insurance(models.Model):
    code = models.CharField(max_length=255, blank=True, null=True, default=None, unique=True)

    def __unicode__(self):
        return unicode(self.code)

Or, we can exclude(code=None) in Form ModelChoiceField() that related with this models.

,