Kirjoittaja Aihe: Pyhton Flask HTTP 405 Method Not Allowed  (Luettu 4657 kertaa)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Pyhton Flask HTTP 405 Method Not Allowed
« : 08.05.21 - klo:22.31 »
Voisiko joku kommentoida, miksi tulee tässä koodissa HTTP -koodi 405 ja selaimessa  teksti "Method Not Allowed", kun en näe mitään virhettä koodissa.

HTML-UI -koodi
Koodia: [Valitse]
<!DOCTYPE html>

<html lang="fi">
<head>
<title>Puolisummain -laskuri</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Puolisummain -simulaattori</h1>
    <form action = "http://127.0.0.1:5000/halfadder" method = "post">
        <p>Inputs (x and y):</p>
        <p><b>X</b> - 0<input type="range" min="0" max="1" value="0" class="slider" id="xValue">1</p>
        <p><b>Y</b> - 0<input type="range" min="0" max="1" value="0" class="slider" id="YValue">1</p>
        <p><input type = "submit" value = "Valmis!" /></p>
    </form>
</body>
</html>

Ja Python-koodini
Koodia: [Valitse]
from flask import Flask,url_for, request
app = Flask(__name__)
@app.route("/halfadder")
def puolisummain(x,y):
m=0
s=1
if x+y > 1:
m=1
s=0
else:
m=0
s=1
return (m,s)

def index():
print (app.puolisummain(request.form['xValue'].x,request.form['YValue']))
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #1 : 08.05.21 - klo:23.18 »
Voisiko joku kommentoida, miksi tulee tässä koodissa HTTP -koodi 405 ja selaimessa  teksti "Method Not Allowed", kun en näe mitään virhettä koodissa.
...
Koodia: [Valitse]
    <form action = "http://127.0.0.1:5000/halfadder" method = "post">...
Koodia: [Valitse]
@app.route("/halfadder")

Virheilmoitus viittaa siihen, että käytettyä HTTP-metodia ei ole sallittu. Teet POST-kutsun, mutta et määrittele sallittuja metodeja app.route:lla. Dokumentaation mukaan tässä tapauksessa täytyy määritellä sallitut metodit methods argumentilla, koska oletuksena vastataan vain GET-kyselyihin.
https://flask.palletsprojects.com/en/1.1.x/quickstart/#http-methods
Lainaus
By default, a route only answers to GET requests. You can use the methods argument of the route() decorator to handle different HTTP methods.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #2 : 09.05.21 - klo:07.39 »
Kiitti vastauksesta!

Nyt muutin koodia seuraavanlaiseksi app.py:ssä:

Koodia: [Valitse]
app.route("/halfadder", methods=['GET', 'POST'])
sekä

Koodia: [Valitse]
def index():
    if request.method == 'POST':
        print (app.puolisummain(request.form['xValue'].x,request.form['YValue']))

Kirjoitan nyt kun olen kylässä, niin vieraskoneella tätä vastausta, mutta kokeilen tänään tuota koodia, jos sitten toimisi.

Hienoa, että tämäkin tuli selväksi, että vaikka olisi dokumentaatioita pitänyt enemmän selata ennen sorvin ääreen siirtymistä, hutkittua tuli ennen tutkimista tässä tapauksessa. Nyt tämä on selvää jatkossa. Noilla muutoksilla lienee toimiva.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #3 : 09.05.21 - klo:18.17 »
No seuraava ongelma on se, että mielestäni luotuani wsgi.conf tiedoston oikein, ja liitettyäni sen oikeaan paikkaan, ja käynnistettyäni apache2-palvelinpalvelun uudestaan sen jälkeen, että nyt ei tule enää mitään virheilmoitusta, mutta jinja2 ilmeisesti ei tuota oikein oikeita lopputuloksia.

Pistän nyt jakoon kaiken selitysten kanssa, niin joku voinee kommentoida, miten saan tuon puolisummain-simulaattorini toimimaan, niin voin alkaa siirtymään vaativampien lomakkeiden käsittelyyn.

app.py:
Koodia: [Valitse]
from flask import Flask,url_for, request,redener_template,redirect
app = Flask(__name__)
@app.route("/halfadder", methods=['GET', 'POST'])
def puolisummain(x,y):
m=0
s=1
if x+y > 1:
m=1
s=0
else:
m=0
s=1
return (m,s)

def index():
    if request.method == 'POST':
        result = app.puolisummain(request.form['xValue'],request.form['YValue'])
    return render_template("/index.html", data=result)

Tuossa on pieni muutos alkuperäiseen, esim renrer_templaten käyttö, mutta koodissa ei liene virheitä.

Sitten Lomake.html
Koodia: [Valitse]
<!DOCTYPE html>

<html lang="fi">
<head>
<title>Halfadder -simulator</title>
<link rel="stylesheet" type="text/css" href="engineering.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Halfadder -simulator</h1>
<table colspan="2">
    <td>
        <img src="halfadder.png" alt="Puolisummain loogisilla piireillä.">
    <td>
    <div id="formStyle">
        <form action = "http://127.0.0.1/halfadder" method = "POST">
            <h2>Inputs (x and y):</h2>
            <p><b>X</b> - 0<input type="range" min="0" max="1" value="0" class="slider" name="xValue">1</p>
            <p><b>Y</b> - 0<input type="range" min="0" max="1" value="0" class="slider" name="YValue">1</p>
            <p><input type = "submit" value = "Valmis!" /></p>
        </form>
           
    <p> id="descText">Halfadder contains two logical circuits attached together. There are two Inputs (x and y) valued for digits 0 or 1 and returning result contains result column value and memory column value. Combining halfadders together we can build sum - calculator for binary digits for ie. 8 halfadder combined together we can get result of 4 -digits binary value sum.
    </td></td></tr>
</table>   


<div id="tulokset"></div>
</body>
</html>

.wsgi
Koodia: [Valitse]
#! /usr/bin/python3.6

import logging
import sys
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, '/home/myUserName/ExampleFlask/')
from my_flask_app import app as application
application.secret_key = 'tonzOfFishes'

sitten .conf tiedosto polussa /etc/apache2/sites-available
Koodia: [Valitse]
<VirtualHost *:80>
     # Add machine's IP address (use ifconfig command)
     ServerName 127.0.0.1
     # Give an alias to to start your website url with
     WSGIScriptAlias /testFlask /home/myUsername/FlaskExample/my_flask_app.wsgi
     <Directory /home/myUsername/FlaskExample/>
      # set permissions as per apache2.conf file
            Options FollowSymLinks
            AllowOverride None
            Require all granted
     </Directory>
     ErrorLog ${APACHE_LOG_DIR}/error.log
     LogLevel warn
     CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

tuolla polussa /var/www/html/halfadder index.html tiedosto näyttää seuraavanlaiselta
Koodia: [Valitse]
<!DOCTYPE html>

<html lang="fi">
<head>
<title>Halfadder -simulator</title>
<link rel="stylesheet" type="text/css" href="engineering.css">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
{% for k in result.items() %}
<p>{{k}}</p>
{% endfor %}
</body>
</html>

Nyt tulosteena tulee selaimessa seuraava tuloste:
Koodia: [Valitse]
{% for k in result.items() %}

{{k}}
{% endfor %}

Eli Jinja2 ei toimi oikein. Miten korjaan tämän.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #4 : 10.05.21 - klo:08.15 »
Oletko saanut flask appia toimimaan ilman apachea ? Se olisi järkevä eka steppi ennen kuin yrittää tehdä apache deoploy virityksiä.

Github tod.näk. löytyy valmiita esimerkkiprojekteja josta voi katsoa mallia.

Tällainen tuotoriaali osui vastaan ja vaikuttaa pätevältä ja hyvin tehdyltä:

https://www.digitalocean.com/community/tutorials/how-to-make-a-web-application-using-flask-in-python-3


Digital ocean julkaisemat tutorialit on muutenkin hyviä oli aihe mikä tahansa.


Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #5 : 10.05.21 - klo:09.42 »
Kiitos vinkeistä, Pete!

Täytyypä oikein ottaa asiaksi, että ensin saisi tuon toimimaan pelkällä Flask -palvelimella.

Tämä on nyt ensimmäinen yritelmäni saada Flask appi toimimaan, kun innostuin verkosta etsimään avoimia APEJA, mitä voisi hyödyntää mukavissa verkkosovelluksissa, mutta käsitykseni olikin väärä, että Apache täytyy olla aktiivinen, että sovellukset toimisi. Palaan asiaan, ehkä vielä tämän päivän aikana!
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #6 : 10.05.21 - klo:10.16 »
Nyt tulee virhekoodi 500, kun ajan pelkällä Flaskilla Flask runin jälkeen portissa 5000

Korjasin Python-tiedostoni oikein sisennykset, ja tuon yhden kirjoitusvirheen siellä. Nyt app.py -näyttää tältä

Koodia: [Valitse]
from flask import Flask,url_for, request,render_template,redirect
app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def puolisummain(x,y):
m=0
s=1
if x+y > 1:
m=1
s=0
else:
m=0
s=1
return (m,s)

def index():
    if request.method == 'POST':
        result = app.puolisummain(request.form['xValue'],request.form['YValue'])
    return render_template("index.html", data=result)

Interal Server error tulee selaimessa, palvelin ei luulisi missään nimessä olevan ruuhkautunut, joten ohjelmakoodissa jotain mätää, mutta mitä?
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #7 : 10.05.21 - klo:10.30 »

Interal Server error tulee selaimessa, palvelin ei luulisi missään nimessä olevan ruuhkautunut, joten ohjelmakoodissa jotain mätää, mutta mitä?

Tällasiasta ei pysty sanomaan mitään ellei pysty itse kokeilemaan koko juttua. Kai siinä jonkinlainen logi on missä on vihjeitä mitä tapahtuu kun tulee virhe ?


Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #8 : 10.05.21 - klo:10.34 »
No ei tuossa päätteellä, kun flask palvelin on ajossa, tule muuta virhettä, kuin tuo ERROR 500.

Tietty vois kokeilla debuggausta.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #9 : 10.05.21 - klo:11.49 »
Interal Server error tulee selaimessa, palvelin ei luulisi missään nimessä olevan ruuhkautunut, joten ohjelmakoodissa jotain mätää, mutta mitä?

Ainakin app.route-dekoraattori on väärässä paikassa. Pitäisi olla index-funktion kohdalla:

Koodia: [Valitse]
@app.route("/", methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        result = app.puolisummain(request.form['xValue'], request.form['YValue'])
    return render_template("index.html", data=result)

Mutta sovelluksen kehityksen ajaksi kannattaa tosiaan kytkeä kehitystila tai debuggaustila päälle, että saat lokiin stack tracen, kun homma menee puihin.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #10 : 10.05.21 - klo:17.42 »
Joo kehitystilassa tätä ohjelmoinkin, en tuotantopalvelimella.

Tuo herjaheitto tulee kahdesta puuttuvasta parametrista x ja y, eli vika on rivillä

Koodia: [Valitse]
result = app.puolisummain(request.form['xValue'], request.form['YValue'])
python ei tulkkaa ymmärtääkseen noita request.form['xVALUE' ] ja yValue, miten saisin html-lomakkeesta inteiksi syottoparametreiksi ne, kun kokeilin ilman lomakkeen syottohakua ihan nollilla ja ykkosilla, niin tämä toimii oikein, kunhan muunnan tuon puolisummain(x,y) -metodin palautusarvona tulleen kokonaislukutaulukon stringiksi, merkkijonoksi.  Tämä sitten, jos ei yritä ohjata tuonne index.html

Ohjauksen osalta index.html:ään tulee 404 not found -selaimessa, vaikka se on samassa hakemistossa tämän app.py:n kanssa.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #11 : 10.05.21 - klo:19.54 »
No nyt sain toimimaan! Html-tiedostossa oli YValue, kun koko ajan yritin hakea yValue, kuten xValue, eli kirjainkoko oli väärä, siksi sieltä tuli erroria ulos. Lopulliset koodit ovat

app.py
Koodia: [Valitse]
from flask import Flask,request,render_template
app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])

def index():
    if request.method == 'POST':
        result = puolisummain(int(request.form['xValue']),int(request.form['yValue'])) 
    return render_template('index.html', r=result,chosenX=int(request.form['xValue']),chosenY=int(request.form['yValue']))       
   

def puolisummain(x,y):
m=0
s=1
if x+y > 1:
m=1
s=0
else:
m=0
s=1
return (m,s)

ja Halfadder.html (Ohjelman käyttöliittymä sijaitsee täällä)
Koodia: [Valitse]
<!DOCTYPE html>

<html lang="fi">
<head>
<title>Halfadder -simulator</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Halfadder -simulator</h1>
<table><td>
    <form action = "http://127.0.0.1:5000/" method = "POST">
        <h2>Inputs (x and y):</h2>
            <p><b>X</b> - 0<input type="range" min="0" max="1" value="0" class="slider" name="xValue">1</p>
            <p><b>Y</b> - 0<input type="range" min="0" max="1" value="0" class="slider" name="yValue">1</p>
            <p><input type = "submit" value = "Let Electrics Flow!" /></p>
    </form>
</td>
<td>
    <img src="halfadder_pic.png" alt="Halfadder">
</td>
<td>           
    <p>Halfadder contains (In Electrics) two logical circuits (XOR and AND ports) attached together. There are two Inputs (x and y) valued for digits 0 or 1 and returning result contains result column value and memory column value. Combining halfadders together we can build sum - calculator for binary digits for ie. 8 halfadder combined together we can get result of 4 -digits binary value sum.</p>
</td>

   
</table>   
</body>
</html>

Sitten index.html, johon ohjataan tulossivulle
Koodia: [Valitse]
<!DOCTYPE html>

<html lang="fi">
<head>
<title>Halfadder -simulator</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h1>Halfadder -simulator</h1>
<h2>Results</h2>
<p>Your picks X - {{chosenX}} - Y - {{chosenY}}
<p>{{r}}</p>

<p>(Memory column, Sum column)</p>

</body>
</html>

Käytin Python 3:sta, requirements.txt
Koodia: [Valitse]
click==7.1.2
Flask==1.1.2
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
Werkzeug==1.0.1

Pistän vielä tuon halfadder_pic.png tähän jakoon, jos joku haluaa katsoa selaimella Flask-ohjelmaani.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #12 : 10.05.21 - klo:22.55 »
@app.route("/", methods=['GET', 'POST'])

def index():

Vielä pieni syntaksihuomio, joka liittyy myös koodin toimintaan: Pythonin normaalin käytännön mukaan dekoraattorin ja funktion väliin ei jätetä tyhjiä rivejä. @app.route -dekoraattori kohdistuu juuri tuohon index-funktioon, eikä sitä pidä siirtää muualle. Jos väliin jättää tyhjää tilaa, siinä on riskinä, että koodia refaktoroidessa vaihtaa erehdyksessä dekoraattorin tai funktion paikkaa siten, että ne irtaantuvat toisistaan, eikä dekoraattori kohdistukaan enää oikeaan funktioon.

Tabulaattoria ei yleensä käytetä Python-koodin sisentämiseen. Jos sitä kuitenkin haluaa käyttää, se olisi paras tehdä johdonmukaisesti kaikkialla. Nykyisin Python 3 taitaa kieltää sisennyksen sekä tabulaattoreilla että välilyönneillä samalla rivillä, eli ainakin silloin on valittava jompikumpi.

Perussyntaksin saa kuntoon näppärästi Blackilla, ja Flake8 tai Pylint kertovat lisää koodin laatuun liittyviä huomioita, joista voi tosin joskus olla perustellusti eri mieltä.

Jere Sumell

  • Käyttäjä
  • Viestejä: 742
  • Talous, Hallinto ja Markkinointi (AMK, 2017),B.B.A
    • Profiili
    • Tietokone-blogi
Vs: Pyhton Flask HTTP 405 Method Not Allowed
« Vastaus #13 : 11.05.21 - klo:09.23 »
Olen asettanut sarkainvälin 4:ksi, mitä käytän graafisella puolella Linuxin oletustekstimuokkainta, ja nanoa sitten päätteellä, en tiedä saako siinä asetettua tuon sarkainvälin tai osaako se sisennykset tai koodin sieventää jollain parametrilla, mutta luin netistä, että vim osaisi sieventää koodin ainakin sisennysten osalta.
Free Internet and  people for humans all over the globe!

(Profiilikuvassa oma valokuvani GIMPissä editoituna Disney Classic-väripaletin väreihin ja muunnettuna bittikartta-tiedostosta vektorigrafiikaksi.)