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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

633閲覧

iOSのTextFieldから入力した文字列をDjango側に送りたい

mememehollow

総合スコア6

Django

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/20 10:17

###前提・実現したいこと
Swift側でTextFieldを作り、そこに文字を打って、その文字をAlamofireのPOSTリクエストでDjango側に送り、Django側で表示させたいです。

###発生している問題
Swift側で設定したparametersを辞書で設定し、Alamofire.requestでPOSTで送っているのですが、Django側で受け取った辞書が空で表示されてしまいます。一応通信は成功しています。

DjangoSide

1<MultiValueDict: {}> 2[20/Apr/2020 16:20:33] "POST /money_management/post/ HTTP/1.1" 200 2 3

###当該のソースコード
以下、Alamofire部分です。

Swift

1import Foundation 2import Alamofire 3 4class PostObserver:ObservableObject { 5 @Published var postString = String() 6 7 init() { 8 self.post() 9 } 10 11 func post() { 12 print(postString) 13 let data:[String:Any] = ["msg":postString] 14 Alamofire.request("http://localhost:8000/money_management/post/", method: .post, encoding: JSONEncoding.default) 15 .responseJSON { response in 16 if response.result.isSuccess { 17 print("成功しました") 18 print(data) 19 20 } else { 21 print("失敗してはります。") 22 } 23 } 24 } 25}

一応ですが、TextFieldを表示させるコードも以下に載せます。

Swift

1import SwiftUI 2import AVFoundation 3 4struct PostView: View { 5 @State var en:String = "" 6 @ObservedObject var postObserver = PostObserver() 7 8 var body: some View { 9 10 VStack { 11 TextField("0", text: $en) 12 .textFieldStyle(RoundedBorderTextFieldStyle()) 13 .frame(width: 200) 14 .padding(.bottom, 50) 15 16 Button(action: { 17 self.postObserver.postString = self.en 18 self.postObserver.post() 19 }) { 20 Text("ボタン") 21 .background( 22 Circle() 23 .foregroundColor(.red) 24 .frame(width:100, height:100) 25 26 ) 27 28 }.padding() 29 30 } 31 32 } 33} 34 35struct PostView_Previews: PreviewProvider { 36 static var previews: some View { 37 PostView() 38 } 39}

また、DjangoのViewの該当部分を載せます。

DjangoSide

1from django.http import HttpResponse, JsonResponse 2from django.views.decorators.csrf import csrf_protect, csrf_exempt 3 4@csrf_exempt 5def post(request): 6 if request.method == 'POST': 7 string = request.FILES 8 print(string) 9 return JsonResponse(request.FILES) 10

コードの説明としてはAlamofireでparameters=["msg": postString]で初期化し、これをDjangoに送りたい、というコードです。このpostStringはTextFieldで入力したものです。これにより、入力したものをDjangoに送ろうとしています。

Django側のrequest.FILESでSwift側のTextFieldで入力した文字列を受け取って、それをprint(string)で表示させようとしています。また、データをhttp://localhost:8000/money_management/post/ にアクセスした時にブラウザ上に表示されるようにしたいです。

あまり自信のないコードですが、どうかよろしくお願いします。

###補足事項
Alamofire 4.8.2を使用

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

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

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

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

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

mememehollow

2020/04/20 11:14

どうもありがとうございます! そこまでは考えてなかったです…とりあえず、受け取ったものを表示させて確認したい一心であったので、request.FILESとしました。request.POSTだとうまくいかなかったのです…
hoshi-takanori

2020/04/20 11:47

送信側と受信側で、それぞれどういう形式でやりとりするか合わせる必要があります。何も考えずにてきとーに指定するってのはよくないですね。 Alamofire 側は JSON で送信しているので Django 側も JSON で受け取るか、HTML のフォームと互換性を持たせたいなら Alamofire もその形式にして Django 側は request.POST するか、でしょうね。
mememehollow

2020/04/20 12:18

はい!ありがとうございます!!
mememehollow

2020/04/20 12:37

具体的にはどのような感じになるか教えていただけないでしょうか
hoshi-takanori

2020/04/20 22:57

Django は詳しくないんですが、Django 側が JSON で受け取りたいならこんな感じでしょうか。 https://tokkan.net/python/django7.html Alamofire が HTML フォーム形式で送信するならこちら。 https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#post-request-with-url-encoded-parameters その前に、HTTP プロトコルについて勉強をすることをお勧めします。 https://milestone-of-se.nesuke.com/l7protocol/http/method-and-status-code/ https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf
mememehollow

2020/04/24 02:31

返信遅くなって申し訳ありません。 こんなにも教えてくださって本当にありがとうございます! 2つ目のgithubを見てやって見たらうまくDjangoが受け取ってくれました。 HTTPプロトコルについて一度勉強してみます! 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問