Flask, écrire dans un fichier les infos reçus via "POST"

Flayme -  
mamiemando Messages postés 33174 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je ne comprends pas pourquoi quand je lance ce code:

from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods=['POST'])
def server():
    data = request.get_json()
    with open("db_game.py", "w") as f:
        f.write(data)

... et qu'après je lance le code suivant :

import requests as rq
import json

BASE = "http://flayme.pythonanywhere.com/"

response = rq.post(BASE, json.dumps({"data": "test"}))

... il n'y a rien qui s'affiche dans le dossier db_game.py.

J'utilise flask sur pythonanywhere, et quand je vais sur mon site ça m'écrit :

405 Method Not Allowed
Method Not Allowed
The method is not allowed for the requested URL.

Merci d'avance pour votre aide

3 réponses

  1. mamiemando Messages postés 33174 Date d'inscription   Statut Modérateur Dernière intervention   7 945
     

    Bonjour,

    D'après cette discussion, ce pourrait dû au / en trop à la fin de la déclaration de la variable BASE. As-tu essayé ?

    Bonne chance

    0
    1. Flayme
       
      import requests
      import json
      
      URL = "http://flayme.pythonanywhere.com"
      PARAMS = '{"data":"test"}'
      response = requests.post(url=URL, json=PARAMS)
      print(response.content)

      reponse.content renvoie :

      b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>500 Internal Server Error</title>\n<h1>Internal Server Error</h1>\n<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>\n'

      Je pense que ça vient de mon programme Flask ou de pythonanywhere (comme le dit l'erreur)

      0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    as-tu fait fonctionner l'exemple "hello world"?

    Si je compare ton code à cet exemple, j'ai l'impression qu'il y manque plusieurs éléments essentiels.

    0
    1. Flayme
       

      L'exemple "hello world" marche:

      l'exemple "hello world":

      from flask import Flask
      app = Flask(__name__)
      @app.route('/', methods=['GET','POST'])
      def server():
          return "Hello world"

      résultat sur la page web:

      Hello world

      résultat sur le programme suivant:

      import requests
      import json
      
      URL = "http://flayme.pythonanywhere.com"
      response = requests.get(URL)
      print(response.content)
      b'Hello world'

      C'est donc mon programme qui marche pas.

      Comment le faire fonctionner (je suis un débutant en Flask)

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Flayme
         

        Pourquoi as-tu supprimé le "return" de ta fonction server()?

        0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    Ceci fonctionne chez moi:

    import flask
    app = flask.Flask(__name__)
    
    @app.route('/', methods=['POST'])
    def server():
        data = flask.request.get_json()
        print("data:",data)
        return "bien reçu: " + data
            
    app.run(host='0.0.0.0', port=81)
    
    import requests 
    import json
    
    d=json.dumps({"un": "deux"})
    response = requests.post("http://127.0.0.1:81", json=d)
    print (response.text)
    
    0
    1. Flayme
       

      Avec ton programme je reçois aussi le "bien reçu: {"un": "deux"}"

      Mais comment je fais pour stocker cela dans un fichier texte?

      J'ai essayé ce code mais ça ne marche pas:

      import flask
      app = flask.Flask(__name__)
      
      @app.route('/', methods=['POST'])
      def server():
          data = flask.request.get_json()
          with open("db_game.txt", "a") as f:
              f.write(data)
          print("data:",data)
          return "bien reçu: " + data

      Celui-ci non plus :

      import flask
      app = flask.Flask(__name__)
      
      @app.route('/', methods=['POST'])
      def server():
          data = flask.request.get_json()
          with open("db_game.txt", "w") as f:
              f.write(data)
          print("data:",data)
          return "bien reçu: " + data

      Pourquoi ça ne marche pas, comment je peux faire?

      Est-ce que tu peux tester mon code et me dire si ça écrit dans ton fichier texte.

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Flayme
         

        Chez moi, cela écrit bien dans le fichier texte.
        Que vois-tu?  Le fichier texte reste vide, ou n'est pas créé?
        Es-tu certain de regarder au bon endroit?
        As-tu testé un programme tout simple qui écrivait dans un fichier?

        0
      2. Flayme > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        • Le fichier reste vide
        • Oui
        • Oui:
        print("start")
        with open("db_game.txt", "w") as f:
            f.write("test")
        print('finish')

        Ce programme écrit bien dans le fichier mais il faut attendre que python charge (sur pythonanywhere), je pense que le problème vient donc de pythonanywhere.

        Connaissez-vous des sites pour héberger mon site programme flask gratuitement ?

        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Flayme
         

        Je ne connais pas d'hébergeur gratuit qui permette d'utiliser un programme Python comme serveur Web.
         

        0
      4. mamiemando Messages postés 33174 Date d'inscription   Statut Modérateur Dernière intervention   7 945 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        As-tu regardé celui-ci ?

        0