画像遅延読み込みはこれ!「lazysizes.js」の使い方を徹底解説!
2022年10月26日水曜日
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'}]>