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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

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

Python

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

Q&A

解決済

2回答

4258閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2017/11/01 04:51

編集2017/11/01 07:05

アクセス禁止 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)

と書きました。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lopn_

2017/11/01 05:00

意図したシステムとはどのようなものですか?
退会済みユーザー

退会済みユーザー

2017/11/01 05:02

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

2017/11/01 05:13

access_keyの値が100以外なら403を出すような仕組みでしょうか?
退会済みユーザー

退会済みユーザー

2017/11/01 05:22

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

回答2

0

ベストアンサー

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

参考:How to Return JSON-Encoded Response

Python

1from django.http.response import JsonResponse 2def index(request): 3 inp_id = request.POST['access_key'] 4 5 # responseに記載している検索処理(略) 6 7 if !find: # 「エラーを出す」処理はお好きなように 8 return HttpResponseNotFound() 9 10 return JsonResponse(id_json)

投稿2017/11/01 07:30

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

追記

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

python

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

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

python

1for i in xrange(len(arr)): 2 if inp_id == arr[i][0]: 3 find = True 4 else: 5 find = False 6 if find: 7 uuid = arr[i][1] 8 print(uuid) 9 else: 10 print("Error")

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

投稿2017/11/01 06:06

編集2017/11/01 07:52
Lopn_

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー
Lopn_

2017/11/01 06:26

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

2017/11/01 06:35

UserIDFormというのはあなたが別に書いたものですか? それともDjangoの機能のうちの一つでしょうか? それによって変わります
退会済みユーザー

退会済みユーザー

2017/11/01 06:48

UserIDFormは自分で書いたものです。質問文に追記しました。
退会済みユーザー

退会済みユーザー

2017/11/01 06:50

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

2017/11/01 06:56

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

退会済みユーザー

2017/11/01 06:58

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

2017/11/01 07:01

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

退会済みユーザー

2017/11/01 07:06

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

2017/11/01 07:16

index.htmlとresponse.htmlはどのディレクトリにおいてありますか?
退会済みユーザー

退会済みユーザー

2017/11/01 07:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問