hikaru’s diary

Django Engineer

【Django】Vue.jsを触ってみる

初期値から1秒ごとに1ずつ増えていくアプリです。初期値はviewsから引っ張ってくることとします。

ソースコード

scriptはvue.jsのチュートリアルを参考にしています。


test.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://unpkg.com/vue@next"></script>
    <script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.0/dist/js.cookie.min.js"></script>
</head>
<body>
  <h1>This is test page</h1>
  <p>{{test_text}}</p>
  <br>
  <div id="counter">
    Counter: [[ counter ]]
  </div>
  <script>
    const Counter = {
  data() {
    return {
      counter: {{ counter_init }}  # ここ
    }
  },
  mounted() {
    setInterval(() => {
      this.counter++
    }, 1000)
  },
  delimiters: ['[[', ']]']
}
Vue.createApp(
  Counter
).mount('#counter')
</script>

</body>
</html>


views.py

from django.views.generic import TemplateView
from django.shortcuts import render


class Test(TemplateView):
    template_name = 'test.html'

    def test(self):
        context = {
            'test_text': "This is Django test text!",
            'counter_init': 100
        }

        return render(self, 'test.html', context)
結果


アクセスするとCounterが100から1秒ごとに1ずつ増えていくのを確認できました。
以上、お疲れ様でした。

【Django】環境変数を設定する

コマンド一つ一つに環境変数を設定するのすごく面倒臭くなったので。

django-environをインストール

pip install django-environ


manage.pyと同じディレクトリに.envを作成
.env

DB_HOST=localhost
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=****
SECRET_KEY=****


settings.pyで環境変数を使ってみる

import environ
import os

BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY')

既に設定してある環境変数を消しても起動できたら成功。

私は使っていませんが、他に色んな機能があるっぽいので気になる方はこの記事の下にあるgit見てください。

DATABASES = {
    # read os.environ['DATABASE_URL'] and raises
    # ImproperlyConfigured exception if not found
    #
    # The db() method is an alias for db_url().
    'default': env.db(),  # ここ

    # read os.environ['SQLITE_URL']
    'extra': env.db_url(
        'SQLITE_URL',
        default='sqlite:////tmp/my-tmp-sqlite.db'
    )
}


追記:env('DEBUG')などで渡される変数は文字型なので注意

参考

github.com

【Django】OAuth 2.0を使ってGmail送信

8/2追記:GCPの設定をしなくてもアプリパスワードからパスワードを生成したら出来るそうです。
[Django]Gmailのメールアドレスからメールを送信できるようにする | CodeLab
アプリ パスワードでログインする - Google アカウント ヘルプ



googleのセキュリティ強化によりユーザー名パスワードのみでログインするサードパーティアプリにアクセスできなくなりました。
Djangoではメールをグーグル以外にしたり回避方法がいくつかあるっぽいですが、推奨されているOAuth 2.0っていうのを使っていきます。


GitHub - dolfim/django-gmailapi-backend: Email backend for Django which sends email via the Gmail API

pip install django-gmailapi-backend


settings.py

INSTALLED_APPS = [
    ...
    'gmailapi_backend',
    ...
]

EMAIL_BACKEND = 'gmailapi_backend.mail.GmailBackend'

# のちに設定
GMAIL_API_CLIENT_ID = 'client_id'
GMAIL_API_CLIENT_SECRET = 'client_secret'
GMAIL_API_REFRESH_TOKEN = 'refresh_token'


クライアントID,シークレットキー,トークンが必要なのでGCPから色々設定する
OAuth 2.0 を使用してGoogle API にアクセスする方法



無事メール送信できました。
以上、お疲れ様でした。

【Django】カスタムした404や500ページを作る

appやconfigと同じ階層の場所にtemplatesフォルダを作成
テンプレートを作成

templates/404.html

{% extends 'base.html' %}
{% block title %}404{% endblock %}
{% block content %}
<h2>404エラーです。ページが見つかりません。</h2>
{% endblock %}

templates/500/html

{% extends 'base.html' %}
{% block title %}500{% endblock %}
{% block content %}
<h2>500エラーです。エラー内容をメール送信しました</h2>
{% endblock %}

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 編集
        """省略"""
    },
]


DEBUG=Falseにして起動後、404の確認。


以上、お疲れさまでした。

【Django】エラーをメール通知する

【Django】500エラーをメールで通知しよう! - hikaru2323’s diary

気づいたら動かなくなってたので書き直しました。Gmailです。


settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_SSL = True
EMAIL_PORT = 465
EMAIL_HOST_USER = os.environ.get('EMAIL_ADDRESS')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASSWORD')

LOGGING = {
    'version': 1,
    """省略"""
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
            'filters': ['custom'],  
        },
    },
    'loggers': {
        'django': {
            'handlers': ['mail_admins'],
            'level': 'INFO',
            'propagate': True,
        },
    },
}


以上、お疲れさまでした。




追記:6月7日DEBUG=Trueでもエラー通知されてたので修正
ロギングでDEBUG=FALSEの時のみ通知させる。
docs.djangoproject.com


settings.py

LOGGING = {
    """省略"""
    'filters': {  # 追加
        "require_debug_false": {
            "()": "django.utils.log.RequireDebugFalse",
        },
        "require_debug_true": {
            "()": "django.utils.log.RequireDebugTrue",
        },
    },
    'handlers': {
        """省略"""
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': True,
            'filters': ['custom', "require_debug_false"],  # 追加
        },
    },
}


私はファイルや日時のログを取りたくてロギングをカスタムしていますが、そもそもデフォルトでそれらを出力してほしいなあと。

【Python】リストの列集計をする

学生番号、学生名、点数が入っているリストがあったとします。

list = [
    [1, 'hikaru', 100],
    [2, 'taro', 50],
    [3, 'hanako', 70],
    [3, 'yuta', 90],
    [4, 'kota', 60]
]

sum = 0
for i in range(len(list)):
    sum += list[i][2]
print("sum", sum)

実行結果:sum 370

行集計の場合

list2 = [
    [1, 2, 3, 4, 5],
    ['hikaru', 'taro', 'hanako', 'yuta', 'kota', ],
    [100, 50, 70, 90, 60]
]

sum2 = 0
for i in range(len(list2[2])):
    sum2 += list2[2][i]
print("sum2", sum2)

実行結果:sum2 370


以上、お疲れさまでした。

BIG5性格診断をやってみた4

前回:BIG5性格診断をやってみた3 - hikaru2323’s diary


テストの信頼性

この診断に対する姿勢、自己理解
≫この検査の信頼性の偏差値は「A」です。(S~Cまでの4段階評価)

この結果は信頼できます。とても真剣な態度で受けたことが考えられます。この検査に対し、建前で回答し、結果には普段より高く評価した自分が反映されている可能性があります。従って得点がやや高くなっているかもしれません。自分の欠点を少し認めすぎて回答した可能性があります。以上のことを考慮し、以下の文章を読んで下さい。

交流力

社会に対する向き合い方
≫あなたの交流力の偏差値は「29」です。

総合的に内向的な人と言えるでしょう。心は外向きと内向きをバランスよく持ち、打たれ強さは標準的で、対人関係に少し消極的なところがあります。また、社会的な接触を好む方で、人前をあまり気にする方ではなく、社交的な場所では人並みに振る舞うことができます。

調和力

他者に対する接し方
≫あなたの調和力の偏差値は「65」です。

総合的に自分よりやや他人を優先する、協調性がある人と言えるでしょう。人に対してとても思いやりがあり、他人に敵意を感じたときは、その敵意が表に出ないように隠し、敵意がないことを強調します。また、人の気持ちには適度に気づき、適度に他人を疑います。自分の心理的問題や精神的な不安を認めることができ、心に余裕があるため、人に対して融通を利かすことができるでしょう。他人にはとても肯定的な態度をとり、親切で、自分から進んで協力します。反社会的行動を起こす可能性は少なく、法律などの社会的規範をやや尊重しない傾向にあります。

適応力

社会に対する適応力
≫あなたの適応力の偏差値は「55」です。

総合的に、真面目な方で、平均的な社会性を持っています。勤勉さは標準的であり、良識性があり、物事に対する判断は、あまり感情に流されることはありません。人の考えや意見は素直に受け入れることができ、責任感があり、人から信頼されています。一方、自分に対して、あまり劣等感を感じることはありません。

精神力

メンタリティー、心の安定性
≫あなたの精神力の偏差値は「50」です。

総合的に、心の安定性は平均的です。ときどき感情的になることがあり、のんきで受動的で、攻撃的な感情を抑えることができます。また、他人にあまり不信感を抱かず、寛大な心を持ち、不安や緊張が高く、神経質になりがちです。

創造力

物事に対するクリエイティビティ
≫あなたの創造力の偏差値は「49」です。

総合的に知的感性は平均的です。物事に対して適度に関心を持ちます。議論の場では、自分の意見を持ち、適度に自己を主張します。自分の能力への自信は標準的であり、程良く人に頼ります。また、決断力は平均的で、自分の知識や経験を人に伝えることができ、標準的な指導力を持っています。思考方法は現実的で、物事を論理的に考えることが出来ます。

ストレス

今のストレス状況
≫あなたのストレス状況の偏差値は「53」です。

総合的に、現在程良いストレス状況にあります。悲観・楽観的なバランスがとれ、将来に不安を感じたり、何事にもくよくよと考えたりしがちです。また、緊張状態であり、心が落ち着きません。強いストレスを感じている兆候はありません。また、心労の水準は普通で、ほどよい精神状況です。心に問題を抱えている可能性は低いでしょう。

ストレス耐性

ストレスの受け止め方
≫あなたのストレス耐性の偏差値は「48」です。

総合的に、ストレス耐性は平均的です。困難に直面したとき混乱し、適切な判断が出来ないときがあります。また、ストレスを受けても不安や緊張に捕らわれにくいです。ストレスの原因から逃げることなく、受けとめることができます。また、精神的に異常な部分はほとんどみられません。