[3週目8日目授業]Python-3


1.学習内容


Flashは昨日に続いて勉強を続けました.
コメント全体は、ウィンドウベースのCtrl+/です.
昨日フラスコでリンクするとタイトルと内容が変わってタイトルと内容を付けて、クリックして提出すればいいです.
今日はフォームにコンテンツを追加し、画面に追加表示できるようになりました.
@app.route('/create_process/', methods=['POST'])
def create_process():
  global nextId
  title = request.form['title']
  body = request.form['body']
  newTopic = {"id":nextId, "title": title, "body": body}
  topics.append(newTopic) #topic도 함수가 밖에 있지만 수정이 아닌 값을 추가하는거라 global을 쓰지않음
  nextId = nextId + 1
  return redirect(f'/read/{nextId-1}/')
正確に言えば、昨日習ったことは、タイトルと本文を入力すれば、URLの後ろに追加できます.
しかし、このように暴露して書くと、セキュリティの問題が発生する可能性があります.
通常、HTTPプロトコルでは、サーバにコンテンツを送信する方式としてGETとPOSTがある.
IDやパスワードなどの機密情報が漏れる可能性があるため、方法をPOSTに変換します.
したがって、既存のフォームのformタグにmethod="POST"を追加します.
@app.route("/create/")  
def create(): #아무이름도 상관없음.
  content = '''
 <form action="/create_process/" method="POST"> <!--method를 post로 바꾼것. 일반적으로 get으로 전송됨-->
      <p><input type="text" name="title" placeholder="title"></p>
      <p><textarea name="body" placeholer="body"></textarea></p>
      <p><input type="submit" value="create"></p>
    </form>  
  '''
  return template(content)
また、受信者ルータもpostを設定しないとエラーになります.上記の「既存の本文に入力内容を追加」ルータを追加する新しい受信者を作成します.
@app.route('/create_process/', methods=['POST'])
:ちなみに、POSTまたはGETは大文字でなければなりません.
後にdefと書き、一時的にreturnを入力し、画面に値が表示されているかどうかを確認します.
これは、上記の入力値が受信されたかどうかを確認するためです.
def create_process():
	return 'success!'
値が良ければ、新しく出てきたルータに値を書くべきですが、FlaskプロセッサにPOSTを書くならrequestで書くべきです.
Flash request:https://flask.palletsprojects.com/en/2.1.x/quickstart/#the-request-objectへのアクセス方法
また、書く場合は、上部のimportセクションに「request」を追加する必要があります.
from flask import Flask, request
.
.
.
def create_process():
	title = request.form['title'] #일단 제목만 출력해보았다.
	return title
本文値を追加する場合は、タイトルのように追加できます.
body = request.form['body']
このようにフォームに書かれたタイトルと内容を、前のトピックでディレクトリに追加するように追加するには、既存の1に追加することにします.html,2.css,3.jsのリストの後ろに追加して、Web上に表示できます.
まず、newTopicという新しいディックシリーズをdef create process()に書きます.次は私たちが書いたリクエストの下です.
newTopic = {"id":?, "title": title, "body": body} #id는 일단 뭐가 들어갈지 몰라 ?표시로 둠.
requestとして指定された変数(title,body)をディクシャナに書きます.
そして私?部分を埋め尽くす.3つのリストの後に追加されるので、まず初期id設定をなぜ開始するのかを決定します.方法はいろいろありますが、講師が提案した方法は以下の通りです.
3個先に来るので、一番外側にnextIdという新しい変数を作成します.
nextId = 4 #4라 지은 이유는 마지막에 적힌 id가 3이기 때문에.
そしてね.nextIdと書きます.newtopicの次の行nextIdの後に新しいアイテムが表示されます.
nextId = nextId + 1
こう書きます.だから早めにスペースを残しておきます
次にnextIdとnewTopicの間にリストを追加します.
topics.append(newTopic) #newTopic을 추가한다는 의미.
ただしnextId=nextId+1はnextIdを修正する方式であり、nextIdは現在の方式以外に書かれた関数である.外に書いてある関数は修正できません.どうすればいいの?その時は関数の中にありました.
globalとして定義され、外部で使用される関数です.
global nextId
しかし、テーマも追加されているのになぜglobalを使わないのですか?理由は修正ではなく、元の内容に追加するので、あえて書く必要はありません.
こうして肩書きと体を手に入れた.では、あなたがそれを受け取ったことを他の人に知ってもらいたいなら、どうすればいいのでしょうか.
return値に任意に「success」を出力し、出力画面「go!「」と書きます.
書いてあるページは/read/だと知っていますが、idの数字はどこに書けばいいですか?nextId定義のページにアクセスできます.
3の後ろが「4」なら「追加されたコンテンツ」に行きたい場合は、「/read/nextId-1」と言えます.
私たちは前に自動的に次の空間+1を生成するので、元の空間のページのように見せるには-1が必要です.したがって,正確な声明をf~stringと書き,以下に示す.

@app.route('/create_process/', methods=['POST'])
def create_process():
  global nextId
  title = request.form['title']
  body = request.form['body']
  newTopic = {"id":nextId, "title": title, "body": body}
  topics.append(newTopic) #topic도 함수가 밖에 있지만 수정이 아닌 값을 추가하는거라 global을 쓰지않음
  nextId = nextId + 1
  return f'Success! go:/read/{nextId-1}/'
これで空白画面の上端にSuccess!go/read/4はこのように表示されますただし、ユーザーに一日でコピーしてアドレスウィンドウに貼り付けることはできません.元の画面に戻すには、リダイレクトする必要があります.
redirectもimportに追加し、入力後に式を記入します.
新しく追加されたのは「4.「コンテンツ」が追加されているため、ユーザーをそのページにジャンプさせる機能をリダイレクトと呼ぶ.
@app.route('/create_process/', methods=['POST'])
def create_process():
  global nextId
  title = request.form['title']
  body = request.form['body']
  newTopic = {"id":nextId, "title": title, "body": body}
  topics.append(newTopic) #topic도 함수가 밖에 있지만 수정이 아닌 값을 추가하는거라 global을 쓰지않음
  nextId = nextId + 1
  return redirect(f'/read/{nextId-1}/')
すると、コンテンツを追加するページが表示されるにつれて、本文とタイトルもコンテンツの追加出力に変換されます.
+データベースの詳細について学習しました.多くのデータベース・プログラムで学んだことは
SQlite 3でこれを表にして、列と行を追加することを学びましたが、授業の内容が超えていて、明日学んだ内容を合わせてアップロードしたいと思っています.

2.難点と解決策


後で「削除」の内容を学びました.(作成、読み取り、修正、削除の間、修正時間が足りず、学習できません)
ボタンを生成してボタンを押すと、リストから選択したコンテンツを削除する機能を持つコードを作成できます.
まず、フォームラベルを作成し、template関数にボタンを追加します.
<li>
 <form action="/delete/{id}/" method="POST">
   <input type="submit" value="delete">
 </form>
</li>
ここまで、deleteのルータを追加します.
@app.route('/delete/<int:id>/', methods = ['POST']) #수령받는 메소드는 여러개일 수 있어서(get이나 post나 그래서복수형인 's'가 들어간다.
def delete():
しかし、ここから、どうやって表に記入すればいいか分からないので、授業を再開することにしました.
delete()では、カッコ内にidが必要です.
idは変化する値なので変数を書き、その値を入力すると次の関数を実行する必要があります.
次にIntra()を定義し、文字として出力するために数値として宣言します.
return値にstr(id)を書くべきです.
すると、該当するIDの数字が出力されます.
/delete/1このようなページアドレスであれば、1のみ出力します.
クレンジング機能を入れたい場合はどうすればいいですか?トピックのアイデンティティ値が選択したWebサイトの値と一致する場合は、トピックを削除し、トピックを繰り返す意味でfor文を使用します.
  for topic in topics:
    if topic['id'] == id:
なぜ複文を書くのか分かりませんが、テーマの資料によって毎回違うものを書くので、書くことになります.
だから削除はremoveなので、適用するにはこのように書きます.
topics.remove(topic) #topics안에 해당 topic 내용이 있으면 관련 내용 전체를 삭제한다는 의미.
だから後ろは繰り返し文なのでbreak;追加してreturnを書き換えるといいです.
削除はすぐに削除されたと判断できませんので、
リダイレクトを書いて、ホームページ「/」の後ろに1つ追加すればいいです.
@app.route('/delete/<int:id>/', methods = ['POST'])
def delete(id):
  for topic in topics:
    if topic['id'] == id:
      topics.remove(topic)
      break;
  return redirect('/')

3.勉強の心得


前の日の内容を理解していないと、勉强するのが难しくなってきます.
昨日の延長線ですが、新しい命令が出るたびに混乱しますが、不思議です.
私一人で関数を書かせても書ききれませんが、上の行がもう勉強できて役に立つと思うと、少し嬉しいです.