pthon flask server kurdum. index ssayfasında unityden yaptığım sonsuz döngü oyun var ve http istekleri ile masaüstü yada webgl sürümünden websayfasındaki get ile ulaşılamayan ulaşılsa bile kullanması mümkün olmayan bir sayfaya atıyor. burada skorumuz hesabımız ile kaydediyoruz. ve bizi bütün skorların tutulduğu tablo sekmesine yolluyor. bu sekmeye eğer ana saya üzerinden ulaşırsak sorun yok ancak şimdi anlattığım şekilde geldiğimiz zaman tarayıcının back tuşu ile tekrar az önce kaydettiğimiz skor formunu açıyor. bu drum beni çok rahatsız etti ayrıca bu aynı skorun tekrar tekrar kaydedilmesinden dolayı gereksiz veri kirliğine sebep olur.
skorların db tablosu
class Score(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
point = db.Column(db.Integer, nullable=False)
continent = db.Column(db.String(20), nullable=True)
date = db.Column(db.DateTime, default=datetime.utcnow)
bunlar skoru unityden aldığımız , kaydettiğimiz ve skorların hepsini bulundurduğumuz sayfalar.
# add score with unity
@app.route("/submit-score", methods=["GET", "POST"])
def submit_score():
# Eğer daha önce skor gönderildiyse GET ile tekrar açmaya izin verme
if request.method == "GET":
if session.get('score_submitted'):
return redirect("/") # İstersen özel uyarı sayfası da gösterebilirsin
return render_template("submit_score.html", point=None)
# POST isteğiyle geldiğinde işlem yapılır
point = request.form.get("point")
if not point:
return "❌ Skor verisi eksik.", 400
try:
point = int(point)
except ValueError:
return "❌ Skor geçerli değil.", 400
# Başarılı işlemden sonra sayfa gösterilecek
session['score_submitted'] = True
return render_template("submit_score.html", point=point)
@app.route("/finalize-score", methods=["POST"])
def finalize_score():
email = request.form.get("email")
password = request.form.get("password")
point = request.form.get("point")
continent = request.form.get("continent") or "Dünya"
if not email or not password or not point:
return render_template("submit_score.html", point=point, message="❌ Eksik bilgi.")
user = Users.query.filter_by(email=email).first()
if not user:
return render_template("submit_score.html", point=point, message="❌ Bu e-posta sistemde kayıtlı değil.")
if not check_password_hash(user.password, password):
return render_template("submit_score.html", point=point, message="❌ Şifre yanlış.")
try:
point = int(point)
except ValueError:
return render_template("submit_score.html", point=point, message="❌ Skor geçerli değil.")
new_score = Score(name=user.name, point=point, continent=continent)
db.session.add(new_score)
db.session.commit()
session.pop('score_submitted', None) # işlem bitince sıfırla
return redirect(url_for("scoreboard"))
# scoreboard
@app.route("/scoreboard")
def scoreboard():
scores = Score.query.order_by(Score.point.desc()).all()
return render_template("scoreboard.html", scores=scores)
scoreoard sayfası
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Skor Tablosu</title>
<script>
history.pushState(null, null , null, location.href); // sahte geçmiş oluştur
window.addEventListener("popstate", function () {
location.href = "/"; // geri tuşuna basıldığında ana sayfaya git
});
</script>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
h2 {
text-align: center;
color: #333;
margin-top: 20px;
}
.score-box {
background: #fff;
max-width: 700px;
margin: 20px auto;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
th,
td {
padding: 12px;
text-align: center;
border-bottom: 1px solid #ddd;
}
th {
background-color: #e0f0ff;
color: #333;
}
tr:hover {
background-color: #f1f9ff;
}
.home-link {
display: block;
text-align: center;
margin-top: 10px;
font-size: 16px;
color: #0066cc;
text-decoration: none;
}
.home-link:hover {
color: #004999;
}
</style>
</head>
<body>
<h2>Skorlar</h2>
<a class="home-link" href="/">← Ana Sayfa</a>
<div class="score-box">
<table>
<tr>
<th>İsim</th>
<th>Skor</th>
<th>Kıta</th>
<th>Tarih</th>
</tr>
{% for s in scores %}
<tr>
<td>{{ s.name }}</td>
<td>{{ s.point }}</td>
<td>{{ s.continent }}</td>
<td>{{ s.date.strftime('%d-%m-%Y') }}</td>
</tr>
{% endfor %}
</table>
</div>
</body>
</html>
submit-score formu
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="Cache-Control" content="no-store" />
<title>Skorunu Gönder</title>
<style>
body {
font-family: "Segoe UI", sans-serif;
background-color: #f2f2f2;
margin: 0;
padding: 0;
}
h2 {
text-align: center;
color: #333;
margin-top: 30px;
}
form {
background-color: #fff;
max-width: 400px;
margin: 30px auto;
padding: 30px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
color: #444;
}
input,
select {
width: 100%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 8px;
box-sizing: border-box;
font-size: 14px;
}
input[readonly] {
background-color: #eee;
}
button {
width: 100%;
padding: 12px;
background-color: #2196f3;
color: white;
border: none;
border-radius: 8px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s ease;
}
button:hover {
background-color: #1976d2;
}
p {
text-align: center;
color: green;
font-weight: bold;
}
</style>
<script>
history.pushState(null, null,null, location.href); // sahte geçmiş oluştur
window.addEventListener("popstate", function () {
location.href = "/"; // geri tuşuna basıldığında ana sayfaya git
});
</script>
</head>
<body>
<h2>Skorunu Paylaş</h2>
{% if message %}
<p>{{ message }}</p>
{% endif %}
<form action="/finalize-score" method="post">
<label>Skor:</label>
<input type="number" name="point" value="{{ point }}" readonly required />
<label>E-posta:</label>
<input type="email" name="email" required />
<label>Şifre:</label>
<input type="password" name="password" required />
<label for="continent">Kıta:</label>
<select name="continent">
<option value="Dünya" selected>Dünya</option>
<option value="Afrika">Afrika</option>
<option value="Asya">Asya</option>
<option value="Avrupa">Avrupa</option>
<option value="Kuzey Amerika">Kuzey Amerika</option>
<option value="Güney Amerika">Güney Amerika</option>
<option value="Avustralya">Avustralya</option>
<option value="Antarktika">Antarktika</option>
</select>
<button type="submit">Gönder</button>
</form>
</body>
</html>
unity ile veri gönderimi(çalışıyor)
public void SendScoreToWeb(int score)
{
string html = $@"
<html>
<body onload='document.forms[0].submit()'>
<form action='http://127.0.0.1:5000/submit-score' method='post'>
<input type='hidden' name='point' value='{score}' />
</form>
</body>
</html>";
string filePath = Path.Combine(Application.persistentDataPath, "submit_score.html");
File.WriteAllText(filePath, html);
Application.OpenURL("file://" + filePath);
}
ben sorunun js ile çözülebileceğini düşünüyorum ancak yeterli blgiye sahip değilim. yardımcı olabilirseniz çok iyi olur