質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python

    7967questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Django

    1050questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

アクセス禁止 403エラーが出てしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 831
退会済みユーザー

退会済みユーザー

アクセス禁止 403エラーが出てしまいます。
POSTMANを使いhttp://localhost:8000/app/index に、Keyにaccess_keyをValueに100を書いてPOSTを選択しSENDを送ると

<h1>アクセス禁止 
                <span>(403)</span>
            </h1>
            <p>CSRF検証に失敗したため、リクエストは中断されました。</p>
            <p>このメッセージが表示されている理由は、このサイトはフォーム送信時にCSRFクッキーを必須としているためです。このクッキーはセキュリティ上の理由(使用中のブラウザが第三者によってハイジャックされていないことを確認するため)で必要です。</p>
            <p>もしブラウザのクッキーを無効に設定しているならば、same-originリクエストのために少なくともこのサイトでは再度有効にしてください。</p>


と期待している動きではない動きをしました。
上記のURLに上記のKeyとValueを送ると、id_jsonが返ってくる仕組みにしたいです。
views.pyには、

from django.shortcuts import render
from .forms import UserIDForm
from .models import User
import json

def index(request):
    user_id_form = UserIDForm(request.POST or None)
    context = {
      'user_id_form': user_id_form,
    }

    return render(request, 'index.html')

def response(request):
    user_id_form = UserIDForm(request.POST or None)
    arr = [[100,2],[300,3],[500,4],[800,5],[200,6]]
    inp_id = 100
    for i in range(int(len(arr))):
        if inp_id == arr[i][0]:
           find = True

        if find:
           uuid = arr[i][1]
           id_json = {"id": 100}
           print(id_json)
       else:
           print("Error")

    return render(request, 'response.html')


と書き、index.htmlには

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>入力ページ</title>
</head>
<body>
<form method="post" action="response">
    {% csrf_token %}
</form>

</body>
</html>


と書き、response.htmlには

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>応答</title>
</head>
<body>
    <h2>応答ページ</h2>
</body>
</html>


と書きました。
POSTMANでJSONを送るときhtmlでformタグを使うのが間違っているのでしょうか?どのように書けば自分の意図したシステムになりますか?
forms.pyには

from django import forms
from .models import User

class UserIDForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('id',)

    def __init__(self, *args, **kwargs):
        super(UserIDForm, self).__init__(*args, **kwargs)
        self.fields['id'].widget.attrs['class'] = 'form-control'



models.pyには

from django.db import models
import uuid
import random

class User(models.Model):
    uu_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    id = models.IntegerField(null=True)
    regist_date = models.DateTimeField(auto_now=True)
    random_id = random.randint(1000, 9999)


と書きました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lopn_

    2017/11/01 14:00

    意図したシステムとはどのようなものですか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/01 14:02

    POSTMANを使いhttp://localhost:8000/app/index に、Keyにaccess_keyをValueに100を書いてPOSTを選択しSENDを送るとid_jsonがJSON形式で返ってくる仕組みです

    キャンセル

  • Lopn_

    2017/11/01 14:13

    access_keyの値が100以外なら403を出すような仕組みでしょうか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/11/01 14:22

    access_keyの値が100以外ならErrorを出す仕組みです

    キャンセル

回答 2

checkベストアンサー

+1

Django初心者ですが、以下の要領でjsonデータ返せるようです。
動作未確認ですので、必要なモジュールimportや処理詳細は補ってください。

参考:How to Return JSON-Encoded Response

from django.http.response import JsonResponse
def index(request):
    inp_id = request.POST['access_key']

    # responseに記載している検索処理(略)

    if !find: # 「エラーを出す」処理はお好きなように
        return HttpResponseNotFound()

    return JsonResponse(id_json)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

settings.pyからMIDDLEWAREのdjango.middleware.csrf.CsrfViewMiddlewareをコメントアウトしましたか?

追記

こちらのコードでは{'id': 100}を5回連続で表示するコードにしかなっていません

for i in range(int(len(arr))):
 if inp_id == arr[i][0]:
  find = True
 if find:
  uuid = arr[i][1]
  id_json = {"id": 100} #ここで必ず{"id": 100}にしている
  print(id_json)
 else:
  print("Error")

if文を二回連続で打ち込んでいるため、一度findがTrueになってしまうと後続もTrueの処理をしてしまいます。
なのでこれを

for i in xrange(len(arr)):
  if inp_id == arr[i][0]:
    find = True
  else:
    find = False
  if find:
    uuid = arr[i][1]
    print(uuid)
  else:
    print("Error")


としてください。
len(arr)でint型になるのでint()は必要ありません。
uuidをプリントするのでないなら、その部分を別のものに置き換えてください

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 15:19

    ありがとうございます。その部分をコメントアウトすると、ただindex.htmlが表示されました。http://localhost:8000/app/responseに行いKeyにaccess_keyをValueに100を書いてPOSTを選択しSENDを送ると、ただresponse.htmlが返ってきました。views.pyのid_jsonをhttp://localhost:8000/app/responseにKeyとValueを送ると返ってくるようにしたかったのですが。。。どうしたらよいでしょうか?

    キャンセル

  • 2017/11/01 15:26

    indexの部分をindex.htmlではなくresponse.htmlを返すように書いてみてはどうでしょうか?
    def index
    ...
    return render(request, 'response.html')

    キャンセル

  • 2017/11/01 15:35

    UserIDFormというのはあなたが別に書いたものですか?

    それともDjangoの機能のうちの一つでしょうか?
    それによって変わります

    キャンセル

  • 2017/11/01 15:48

    UserIDFormは自分で書いたものです。質問文に追記しました。

    キャンセル

  • 2017/11/01 15:50

    indexの部分をindex.htmlではなくresponse.htmlを返すように書いてもうまくいきませんでした。

    キャンセル

  • 2017/11/01 15:56

    models.pyやインポート部分などの依存も書いてもらえますか?

    キャンセル

  • 2017/11/01 15:58

    インポート部分とはどこのことを言っていますか?settings.pyのことでしょうか?

    キャンセル

  • 2017/11/01 16:01

    models.pyの中身とviews.pyやforms.pyにある
    from xxx import yyyなどのの部分のことです
    import部分はすでに記述してあるなら聞き流してください

    キャンセル

  • 2017/11/01 16:06

    models.pyとインポート部分をすべて追加しました。もし何かお分かりでしたらよろしくお願いいたします

    キャンセル

  • 2017/11/01 16:16

    index.htmlとresponse.htmlはどのディレクトリにおいてありますか?

    キャンセル

  • 2017/11/01 16:18

    models.pyもviews.pyもappというアプリの中にあるのですが、index.htmlとresponse.htmlはappにあるtemplatesフォルダにあります

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7967questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Django

    1050questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。