【django】社内SNSアプリを作ってみる③(signup.py作り込み~ユーザー登録機能の実装)【pythonメモ】

pythonLOGO python
記事内に広告が含まれています。

ところでpostとgetはどう違うのか



ブラウザからリクエストを投げる時に、追加で入れていく情報の種類、情報の送り方

djangoを使う時は下記の理解でとりあえずOK

フォームを送信するとき→post
それ以外のとき→get

例えば

一般的にページに貼られているリンクをクリックした時は、getでサーバーにリクエストを送っている。

postの場合は、サーバーにフォームを送る時に明示的に表している

なので、signup.htmlを下記のようにPOSTを追加する

{% extends 'base.html' %}

{% block content %}
    <form class="form-signin" method="POST">
  <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
  <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1>
  <label for="inputEmail" class="sr-only">Email address</label>
  <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus>
  <label for="inputPassword" class="sr-only">Password</label>
  <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required>
  <div class="checkbox mb-3">
  </div>
  <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
  <p class="mt-5 mb-3 text-muted">© 2017-2020</p>
</form>
{% endblock content %}

views.pyもそれが見えるように改変する

下記、は根本的な部分で間違ってたので、時系列的に少し変になっています

from django.shortcuts import render
from django.contrib.auth.models import User

# Create your views here.

def signupfunc(request):
  if request.method =='POST':
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.create_user(username, '', password)
    return render(request, 'signup.html', {'some':100})
  return render(request, 'signup.html', {'some':100})

これが何をしているかというと、POSTで送られた時のusernameを格納する返信を作っている。

このusernameはsignup.htmlで定義されているnameとなっている。

{% extends 'base.html' %}

{% block content %}
  <form class="form-signin" method="POST" action=''>{% csrf_token %}
    <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1>
    <label for="inputEmail" class="sr-only">Email address</label>
    <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus>
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required>
    <div class="checkbox mb-3">
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    <p class="mt-5 mb-3 text-muted">© 2017-2020</p>
  </form>
{% endblock content %}

3行目のactionはsigninを押した後に、どの画面に飛ばすかを制御するもの”となっているので同じ画面になる。

ただ、押した後は、views.pyにあるifに引っかり、usernameが変数に格納された状態でsignup.htmlを再読み込みする状態となる。

※ {% csrf_token %}はセキュリティ上のおまじない

このままだとデータベースが作られていないのでmakemigrationsでデータセットを作る

python3 manage.py makemigrations

python3 manage.py migrate
python3 manage.py createsuperuser

その上でスーパーユーザーを作成する

その後サーバーを起動する

python3 manage.py runserver
http://127.0.0.1:8000/signup/

サインアップ画面で、sato、パスワードを入力してから、スーパーユーザーとしてログイン

http://127.0.0.1:8000/admin/
からログインする
http://127.0.0.1:8000/admin/auth/user/

サインイン画面で入力したユーザーがここに記憶されていれば成功

userテーブルの中身を見てみる

views.py 10行目の

    user = User.objects.create_user(username, ”, password)

これが何なのか調べるために、ちょっと改変する

from django.shortcuts import render
from django.contrib.auth.models import User

# Create your views here.

def signupfunc(request):
  user2 = User.objects.all()
  print(user2)
  if request.method =='POST':
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.create_user(username, '', password)
    return render(request, 'signup.html', {'some':100})
  return render(request, 'signup.html', {'some':100})
http://127.0.0.1:8000/signup/

一度クリックしてみると

こんな感じでユーザー一覧が出てくる

ここでadmin画面からもう一度入ってみて、スーパーユーザーのaaaにメールアドレスを設定してみる

ここでメールアドレスは適当に入れたが、確認時は使える自分のアドレスを入れてみる

views.pyの7,8行目については

  user2 = User.objects.get(username='sato')
  print(user2.email)

とするとsatoのメールアドレスを引っ張ってくることができる

重複ユーザーを防ぐ方法

サインインのあったユーザー名と、データベース上のユーザー名を突き合わせて、いなかったら通常の処理をする。

from django.shortcuts import render
from django.contrib.auth.models import User

# Create your views here.

def signupfunc(request):
  if request.method =='POST':
    username2 = request.POST['username']
    password2 = request.POST['password']
    try:
      User.objects.get(username=username2)
      return render(request, 'signup.html', {'error':'このユーザーは登録されています'})
    except:
      user = User.objects.create_user(username, '', password2)
      return render(request, 'signup.html', {'some':100})
  return render(request, 'signup.html', {'some':100})

signup.htmlで表示させる

{% extends 'base.html' %}

{% block content %}
  <form class="form-signin" method="POST" action=''>{% csrf_token %}
    <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
    <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1>

    {% if error %}
    {{ error }}
    {% endif %}

    <label for="inputEmail" class="sr-only">Email address</label>
    <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus>
    <label for="inputPassword" class="sr-only">Password</label>
    <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required>
    <div class="checkbox mb-3">
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    <p class="mt-5 mb-3 text-muted">© 2017-2020</p>
  </form>
{% endblock content %}

サーバーを立ち上げて、satoでサインインしてみると

うまくいきました。





コメント

タイトルとURLをコピーしました