自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

  • DRFはいつCSRF検証をするのか?

    開発中、おかしなことが起こった。 これまでCSRFトークン無しで、PUTやDELETEメソッドが送信できていた。 だが、突然、同様の状況で403エラー(CSRF token missing)が起きた。 CSRFトークン無しでリクエストできていたものが、急に403エラーになりCSRF検証を行うようになった。 何故か? DRFのビューでは、CSRF検証が免除されている https://github.com/encode/django-rest-framework/blob/master/rest_framework/viewsets.py#L146 DRFのビューは、このように .as_view()の戻り ...
  • SQliteはマルチスレッド・マルチプロセスに対応していない

    SQliteはマルチスレッド・マルチプロセスに対応していない。 同時に大量のクエリをさばくことはできない。 実際にやってみる djangoで実際にやってみる。ベースは、40分django from django.shortcuts import render,redirect from django.views import View from .models import Topic from .forms import TopicForm import threading def writing(data): form = TopicForm(data) if form.is_valid(): form.save() class IndexView(View): def get(self, request, *args, **kwargs): print(Topic.objects.all().count()) context = {} context["topics"] = Topic.objects.all() return render(request,"bbs/index.html",context) def post(self, request, *args, **kwargs): threads = [] copied = request.POST.copy() for i in range(1000): thread = threading.Thread(target=writing, args=(copied,)) threads.append(thread) thread.start() # 全てのスレッドが終了するまで待機 for thread in threads: thread.join() return redirect("bbs:index") index = IndexView.as_view() 1回目は正常に1000個分のスレッドを処 ...
  • npm で Fontawesomeを使う

    npm install @fortawesome/fontawesome-free これでfont-awesomeの最新版がインストールされる。後は、App.jsに下記を追加する。 import '@fortawesome/fontawesome-free/css/all.min.css'; importした後、JSXに、 <i className="fa-regular fa-square-check"></i> を追加する。 ちなみに、下記では旧版がインストールされてしまう。 npm install font-awesome ...
  • npm install --save パッケージ名 の--saveは必要か?

    npm install --save パッケージ名 この–saveで、package.jsonにパッケージ名を記録することができる。 ただし、–saveオプションは、npmのバージョン5からデフォルトで有効になっている。 故に、npmバージョン5で、特に設定を触っていない場合は、あえてつける必要はない。 npm install パッケージ名 でよい。 よって、タイトルのnpm install --save パッケージ名 の--saveは必要か? はnpmバージョン5以 ...
  • 【JavaScript】awaitとasyncの違い【非同期処理のコールバック地獄対処】

    【前提知識】同期処理と非同期処理とは 同期処理とは、 console.log("1"); console.log("2"); console.log("3"); このように上から順に実行される処理のことを言う。 一方で、非同期処理とは console.log("1"); setTimeout(() => { console.log("2"); }, 1000); // 1秒後に実行 console.log("3"); このように、処理の完了を待たずに後続の処理を行うことを言う。 setTimeoutの他に、fetchAPIが非同期処理に当てはまる。 fetchAPIのコールバック地獄に対処する。 例えば、fetchAPIでリクエストを書く時、 fetch(url, { method, headers, body }) .then( (res) => { if ...
  • Djangoのcreatesuperuserでインタラクティブシェルを省略する。

    python manage.py createsuperuserで管理ユーザーをつくることができるが、その後のインタラクティブシェルの入力がめんどくさい。 そこで、環境変数を使ってインタラクティブシェルを省略する。 更に、エイリアスを使ってコマンド入力も簡略化させる。 # createsuperuser の自動化 export DJANGO_SUPERUSER_USERNAME="asahina" export DJANGO_SUPERUSER_EMAIL="asahina@asahina.com" export DJANGO_SUPERUSER_PASSWORD="seiya0723" alias django_createsuperuser="python manage.py createsuperuser --noinput" ...
  • 【JavaScript】localStorageを使ってブラウザにデータを記録する【Cookieが使えないときに】

    サーバー側にデータを送信しない場合、セキュリティ上CookieではなくlocalStorageを使う。 ソースコード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Hello World test!!</title> </head> <body> <input id="test" type="text"> <input id="reset" type="button" value="リセット"> <script> const test = document.querySelector("#test"); const reset = document.querySelector("#reset"); // 読み込みされたとき、データがあればテキストボックスにセットする。 const data = localStorage.getItem("test"); if (data){ test.value = data; } // キー入力があるたびにローカルストレージにセットする。 test.addEventListener("change", (event) => { const value = event.currentTarget.value; localStorage.setItem("test",value); }); reset.addEventListener("click", () => { test.value = ""; ...
  • 【Django】逆参照で効率的にDBにアクセスする【.prefetch_related() 】

    例えばこのモデルのとき。 from django.db import models class Category(models.Model): name = models.CharField(verbose_name="名前",max_length=20) class Topic(models.Model): comment = models.CharField(verbose_name="コメント",max_length=2000) category = models.ForeignKey(Category, on_delete=models.CASCADE) 普通に逆参照を使うと、クエリが再実行されるためDBに負担がかかる categories = Category.objects.all() for category in categories # ここでDB読み込み print( ...
  • PythonからWindows共有サーバー(Samba)にアクセスする

    • 作成日時:
    • 最終更新日時:
    • Categories: サーバーサイド
    • Tags: tips
    import platform from smb.SMBConnection import SMBConnection # connection open conn = SMBConnection( '', '', platform.uname().node, '192.168.11.100', domain='WORKGROUP', use_ntlm_v2=True) conn.connect('192.168.11.100', 139) # IPアドレス以降のファイルパスを設定 items = conn.listPath('share' , "sdb1") print([item.filename for item in items]) print(conn.echo('echo success')) conn.close() 参照 https://qiita.com/t2kojima/items/250d68c56a8c9fe95f52 ...