NginxでDjangoの静的ファイルを配信する

まず、Nginxの設定ファイルで/staticと/mediaの参照先を以下のように変更する。
server {
    listen   80;
    server_name 104.236.87.13;
    charset utf-8;
    ...

    location /static {
        # /staticをアップロードするディレクトリを指定
        alias /home/username/staticfiles;
    }


    location /media {
        # /mediaをアップロードするディレクトリを指定
        alias   /var/www/PROJECT/media;
    }
    ...
}
次にsettings.pyのSTATIC_ROOTとMEDIA_ROOTを先ほどNginxの設定ファイルで指定したディレクトリを記述して、
$python manage.py collectstatic
を入力すれば完了。

gulpを使ってscssファイルをコンパイルする

まずはgulp,gulp-sassをインストールします。

npm install --save-dev gulp
npm install -- save-dev gulp-sass

static/scss/に入っているscssファイルを static/css/配下にコンパイルしてみます。

gulpfile.jsを作成して、以下のコードを記述します。

gulpfile.js

var sass = require('gulp-sass');
gulp.task('sass', function () {
    gulp.src('./static/scss/*.scss')
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.dest('./static/css'));
});

gulp.task('watch', function () {
    //ファイルが変更されると,sassタスクが呼ばれる
    gulp.watch('./static/scss/*.scss', ['sass']);
})


Pythonで日付計算をするにはdateutilを使うと簡単

Pythonの標準のdatetimeモジュールだと月の計算を自前で用意しなければならなかったりして、日付計算が面倒になるんだけど、dateutilモジュールのrelativedelta関数を使うと日付計算が簡単になって便利。

インストール

pip install python-dateutil

now = datetime.datetime.utcnow()

from dateutil import relativedelta
#一ヶ月後の日付を求める
date += relativedelta(months=1)

#一週間後の日付を求める
date += relativedelta(months=1)

#明日の日付を求める
date += relativedelta(days=1)

[Django] ユニークなファイル名で画像をアップロードする tips

uuidを使ったファイル名でアップロードすることにより、ファイル名がかぶるのを防ぐことができる。

import uuid
...
def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    name = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join('upload_to_dir', name)


class YourModel(models.Model):
    data = models.ImageField(upload_to=get_file_path,null=True)
    created_date = models.DateTimeField(auto_now = True)

[Django] Userをカスタマイズする

Custom User Modelの作成

AbstractBaseUserを継承したModelを作成します。このModelが標準のUser Modelの機能を満たすためには下記の事項を満たす必要があります。

  • Modelがユニークなキーを持っていること。
  • Modelがユニークなフィールド(username,email,,,etc)を持っていること。
  • get_full_name(),get_short_name()を実装していること。

AuthUser


class AuthUser(AbstractBaseUser, PermissionsMixin):
    def get_short_name(self):
        ...

    def get_full_name(self):
        ...

    username = models.CharField(unique=True, max_length=30)
    email = models.EmailField(unique=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True, null=False)
    is_staff = models.BooleanField(default=False, null=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = AuthUserManager()

USERNAME_FIELDはそのユーザーのユニークなキーを記述します。ここではemailがユニークなフィールドとします。

REQUIRED_FIELDSはユーザーを作成するために必要なキーを記述します。

objects = AuthUserManager()標準のBaseUserManagerを使う代わりにAuthUserManagerを使うということをDjangoに知らせています。 これによって今後create_user,create_superuserのメソッドを呼ぶときにAuthUserManagerクラスのcreate_user,create_superuserのメソッドが呼ばれるようになります。

AuthUserManagerの実装は以下のようになります。

AuthUserManager

class AuthUserManager(BaseUserManager):
    def create_user(self, username, email, password):
        if not email:
            raise ValueError('Users must have an email')
        if not username:
            raise ValueError('Users must have an username')

        user = self.model(username=username, email=email, password=password)
        user.is_active = True
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, password):
        user = self.create_user(username=username, email=email, password=
        password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

次に、DjangoにUserモデルではなく、AuthUserを使用するということをsettings.pyに以下のコードを記述して知らせてあげましょう。

AUTH_USER_MODEL = 'yourapp.AuthUser'

Done!

以上でUserを拡張したAuthUserを作成できました。
Enjoy coding!