2022年10月12日水曜日

DjangoでBasic認証を設定する

 まず、以下のサイトを参照して wsgi-basic-auth をインストールしました。(環境はAmazon Linux2、Apache)

【Django】DjangoアプリにBasic認証をかける
https://qiita.com/mizu4my/items/e8fb51d65f872f302537

まず、ライブラリをインストールします。

$ pip install wsgi-basic-auth

次に、.envファイルに、Basic認証のIDとパスワードを追加します、とありました。

.envファイルとは環境変数を保存するものというのは分かりますが、いったいどこに保存するものなのか書いてありません。
何回か検索して調べると、どうやら django-environ というライブラリを使うらしいことが分かりました。以下のサイトです。

Djangoで環境変数?ならdjango-environを使おうか。
https://qiita.com/moonwalkerpoday/items/9da47dda80d3ddac9a62

最終的には以下のようにしてできました。

wsgi.py(例)

import os
from wsgi_basic_auth import BasicAuth #追加
import environ #追加
env = environ.Env() #追加
env.read_env('/var/www/html/myproject/myproject/.env') #追加.envへのパスの例です。
application = get_wsgi_application()
application = BasicAuth(application) #追加

そして、Apacheの設定ファイル(httpd.conf等)には、WSGIPassAuthorization On を追加することも必要でした。

httpd.conf

WSGIPassAuthorization On #追加


以下を参考にさせていただきました。

WEBアプリケーション開発メモ
http://drunk.chips.jp/web/2021/04/django_basic.html

2022年10月7日金曜日

JavaScript: URLパラメータを連想配列にする

JavaScriptでURLパラメータを連想配列にするには、以下のようにするのが簡潔です。

var urlSearchParams = new URLSearchParams(window.location.search);
var params = Object.fromEntries(urlSearchParams.entries());


URLパラメータ: ?name=ABC&company=XYZ&address=Tokyo

⇒連想配列: {"name": "ABC", "company": "XYZ", "address": "Tokyo"}


参考: How can I get query string values in JavaScript?
https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript

2022年10月6日木曜日

Django: urls.pyのnameをViewで取得する

urls.py で以下のようにnameを設定した場合、

urlpatterns = [
    path('search/', views.Search.as_view(), name="search"),
]

views.pyで以下のようにnameを取得できる。

from django.urls import resolve

URL_NAME = resolve(request.path_info).url_name


2022年10月5日水曜日

Django: QuerySetに対するvalues()とvalues_list()の使い方と結果例

 メモです。

# filter(id__in=[1266, 1267]) は all() に置き換えても同様

# モデルオブジェクト取得の基本形
Product.objects.filter(id__in=[1266, 1267])
    #結果: <QuerySet [<Product: PRD-0001A>, <Product: PRD-0002/0002M>]>


# values() の使い方例
Product.objects.filter(id__in=[1266, 1267]).values('id', 'name')
    #結果: <QuerySet [{'id': 1266, 'name': 'PRD-0001A'}, {'id': 1267, 'name': 'PRD-0002/0002M'}]>
    #ValuesQuerySetと呼ばれるデータ型

# get()で一つのレコードだけ扱う場合
Product.objects.filter(id__in=[1266, 1267]).get(id=1266)
    #結果: <Product: PRD-0001A>

Product.objects.filter(id__in=[1266, 1267]).values('id', 'name').get(id=1266)
    #結果: {'id': 1266, 'name': 'PRD-0001A'}


# values_list() の使い方 *タプルを返す
Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name')
    #結果: <QuerySet [(1266, 'PRD-0001A'), (1267, 'PRD-0002/0002M')]>

Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name').get(id=1266)
    #結果: (1266, 'PRD-0001A')

list(Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name'))
    #結果: [(1266, 'PRD-0001A'), (1267, 'PRD-0002/0002M')]


# get()で一つのレコードだけ扱う場合
Product.objects.filter(id__in=[1266, 1267]).values_list('name').get(id=1266)
    #結果: ('PRD-0001A',)

Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True).get(id=1266)
    #結果: 'PRD-0001A'

# flat=True の例 *フィールドは一つだけ指定します。複数の場合エラーになります。
Product.objects.filter(id__in=[1266, 1267]).values_list('name') #flat=True なし
    #結果: <QuerySet [('PRD-0001A',), ('PRD-0002/0002M',)]>

Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True) #flat=Ture あり
    #結果: <QuerySet ['PRD-0001A', 'PRD-0002/0002M']>

list(Product.objects.filter(id__in=[1266, 1267]).values_list('name')) #flat=True なし
    #結果: [('PRD-0001A',), ('PRD-0002/0002M',)]

list(Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True)) #flat=Ture あり
    #結果: ['PRD-0001A', 'PRD-0002/0002M']


# 外部キーも参照できる
Product.objects.filter(id__in=[1266, 1267]).values('id', 'name', 'category1__name')
    #結果: <QuerySet [{'id': 1266, 'name': 'PRD-0001A', 'category1__name': 'Wheel and axle'}, {'id': 1267, 'name': 'PRD-0002/0002M', 'category1__name': 'Pulley'}]>