Integer mit Javascript and Flask senden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
peacemaker
User
Beiträge: 16
Registriert: Sonntag 2. Oktober 2016, 14:33

Samstag 26. November 2016, 12:44

Ich würde gerne einen Int-Wert mit JS an Flask übergeben. Ich hab n kleines JS-Game programmiert, bei dem man ein Einhorn, dass in einer Random checkbox versteckt ist sucht. Wenn man es gefunden hat, bekommt man 5000 Money, wenn nicht wird einem 250 Money abgezogen.
Jedes mal, eins der beiden statements erfüllt ist, würd ich gerne den Wert (5000 oder -250) an Flask senden und "Money" in der Datenbank anpassen.

games.html

Code: Alles auswählen

if (loc == unicornloc) {
    money = 5000;
    alert("\n\nBRAVO! You found the Unicorn! :)");
    }else {
        money = -250;
        alert("The unicorn isn't here :(")
    }

<FORM method="POST" name="searchb">
<input type=checkbox onClick="javascript:search('x1y1');">
<input type=checkbox onClick="javascript:search('x1y2');">
<input type=checkbox onClick="javascript:search('x1y3');">
games.py

Code: Alles auswählen

@app.route('/games/<money>',methods=['GET'])
@login_required
def games(money):
    print(request.args.get('money', type=int))
    return render_template('games.html',money)
Ich hab auch bereits einen Post bei Stackoverflow erstellt, allerdings kann ich die bisher einzige Antwort nicht nachvollziehen.
(https://stackoverflow.com/questions/408 ... 1#40803061)

Mit freundlichen Grüßen
peacemaker
Zuletzt geändert von Anonymous am Samstag 26. November 2016, 15:32, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
DasIch
User
Beiträge: 2437
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 26. November 2016, 13:49

Wenn du nicht auf dem Server überprüfst ob das Einhorn gefunden wurde, kann ein User trivial cheaten. Es würde Sinn machen dies entsprechend zu ändern. Darüberhinaus verwendest du die falsche HTTP Methode, du solltest POST statt GET verwenden.

Dein games (Name und Pfad sind hier schlecht gewählt) View macht nicht so viel Sinn weil er HTML zurückgibt. Üblicherweise würde man die Informationen als JSON zurückgeben damit man sie in JS verarbeiten kann. Was willst du mit der Antwort machen bzw. was erwartest du was da passiert?

Zum HTML: onclick sollte man nicht verwenden, MDN erklärt wieso und wie man es besser macht. MDN (großartige Seite die man eigentlich immer in einem Tab haben sollte), erklärt auch wie man mit dem Server kommuniziert. Das ist ziemlich aufwendig deswegen gibt es eine neue (noch experimentelle) API namens fetch die noch nicht alle Browser unterstützen (für die es aber Polyfills gibt). MDN liefert auch hierfür tolle Dokumentation. Die dritte Möglichkeit wäre jQuery zu nutzen wir dir in der Stackoverflow Antwort vorgeschlagen wurde. jQuery tut so einiges und bietet unter anderem eine angenehme API für Ajax an. jQuery hat außerdem den Vorteil dass es anders als Fetch keine Promises (ebenfalls noch experimentell und nicht von allen Browsern unterstützt) benötigt.

Ansonsten ist die Stackoverflow Antwort schon ziemlich gut, mir fällt es schwer zu verstehen was du daran nicht nachvollziehen kannst. Es wäre hilfreich wenn du etwas konkreter beschreiben könntest genau was du daran verstehst und was nicht um auf einer Wellenlänge zu sein.
BlackJack

Dienstag 29. November 2016, 21:13

@peacemaker: Wenn das sinnvoll sein soll musst Du letztendlich sowohl das Geld als auch die ”Tür” hinter der sich das Einhorn befindet auf dem Server sichern. Das Geld kannst Du in einem durch einen Hash abgesicherten Cookie speichern bei dem ein Geheimnis auf dem Server ist das man für den Hash braucht, damit der Benutzer nichts an seinem Geld manipulieren kann. Und die Tür für das Einhorn darf nicht zu Browser übertragen werden. Das schöne ist, die muss auch der Server nicht wissen bis tatsächlich geprüft wird. Denn die Tür kann man ja auch auswürfeln *nachdem* der Benutzer sich für eine Tür entschieden hat. Also kommt man ohne Datenbank aus.
BlackJack

Donnerstag 1. Dezember 2016, 09:28

Mal ohne JavaScript:

templates/base.html
[codebox=html5 file=Unbenannt.html]<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Find the Unicorn</title>
</head>
<body>
{% if session.get('username') != None %}
<h1>Hello {{session['username']}}, find the Unicorn</h1>
<p>…or <a href="{{url_for('logout')}}">log out</a>.</p>
{% else %}
<h1>Find the Unicorn</h1>
{% endif %}

{% for message in get_flashed_messages() %}
<p>{{message}}</p>
{% endfor %}

{% block body %}{% endblock %}
</body>
</html>[/code]

templates/index.html
[codebox=html5 file=Unbenannt.html]{% extends "base.html" %}
{% block body %}
<p>Money: {{session['money']}}</p>
<form action="" method="POST">
{% for i in range(1, 10) %}
<input type="radio" id="door{{i}}" name="door" value="{{i}}">
{{'<br>'|safe if i % 3 == 0}}
{% endfor %}
<input type="submit" value="Check!">
</form>
{% endblock %}[/code]

templates/login.html

Code: Alles auswählen

{% extends "base.html" %}
{% block body %}
  <form action="" method="POST">
    <input type="text" id="username" name="username" placeholder="Your name">
    <input type="submit" value="OK">
  </form>
{% endblock %}
main.py

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import random
from flask import (
    flash, Flask, redirect, render_template, request, session, url_for
)


app = Flask(__name__)
app.secret_key = (
    '\rn\x8ex)\xa4\xfa\xdb\xe1\xc9\x9aAd\xfc#\x96\xc9g\x95\xf5\x0b\xc1n)\x16'
)


@app.route('/', methods=['GET', 'POST'])
def index():
    if 'username' in session:
        if request.method == 'POST':
            try:
                door = int(request.form['door'])
            except KeyError:
                pass
            else:
                if door == random.randint(1, 9):
                    amount = 5000
                    message = 'Yeah, found the unicorn!'
                else:
                    amount = -250
                    message = 'No unicorn :-('
                session['money'] += amount
                flash(message)
        return render_template('index.html')
    else:
        return redirect(url_for('login'))


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username'].strip()
        if username:
            session['username'] = username
            session['money'] = 2500
            flash(u'Logged in as {}.'.format(username))
            return redirect(url_for('index'))
    return render_template('login.html')


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))
Antworten