Почему мой веб-сайт Flask постоянно обновляется? [закрыто]Python

Программы на Python
Anonymous
Почему мой веб-сайт Flask постоянно обновляется? [закрыто]

Сообщение Anonymous »

Я пытаюсь создать веб-сайт для социальной сети (похож на TikTok), но страница просмотра постоянно обновляется.
Мой JS отправляет такой JSON на серверную часть, которая отслеживает лайки, антипатии, просмотры и т. д. в базе данных SQLite:

Код: Выделить всё

{
"action": {action e.g. like, dislike, view}
"id": {video_id e.g.  1)
}
Затем серверная часть обрабатывает его с помощью этой функции:

Код: Выделить всё

@app.route('/trackStatistics-Ue3ARmqbiF63KepjbxeI', methods=['POST'])
def track_statistics():
try:
# Get the JSON data from the request
data = request.get_json()

# Validate the action and id
if 'action' not in data or 'id' not in data:
return jsonify({'error': 'Invalid request'}), 400

action = data['action']
video_id = data['id']

data = get_video(video_id)

print(data)

if action == "like":
data["likes"] = int(data["likes"]) + 1
elif action == "dislike":
data["dislikes"] = int(data["dislikes"]) + 1
elif action == "unlike":
data["likes"] = int(data["likes"]) - 1
elif action == "undislike":
data["dislikes"] = int(data["dislikes"]) - 1
elif action == "view":
data["views"] = int(data["views"]) + 1

update_video(video_id, data["publisher"], data["title"], data["likes"], data["dislikes"], data["views"], data["comments"], False)

print(data)

# Return the updated data
return jsonify(data)

except Exception as e:
print(str(e))
return jsonify({'error': str(e)}), 500
Вот файл с определенными функциями update_video, get_video и create_video:

Код: Выделить всё

import sqlite3
import json
from datetime import datetime

def get_video(video_id):
conn = sqlite3.connect('../databases/videos.db')
c = conn.cursor()
c.execute("SELECT * FROM videos WHERE id = ?", (video_id,))
video = c.fetchone()
comments = json.loads(video[6]) if video[6] else []
video = list(video)
video[6] = comments
conn.close()
return {
"id": video[0],
"publisher": video[1],
"title": video[2],
"likes": video[3],
"dislikes": video[4],
"views": video[5],
"comments": video[6],
"created_at": video[7],
"updated_at":  video[8]
}

def create_video(publisher, title, likes, dislikes, views, comments):
conn = sqlite3.connect('../databases/videos.db')
c = conn.cursor()
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
comments_json = json.dumps(comments)
c.execute("INSERT INTO videos (publisher, title, likes, dislikes, views, comments, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
(publisher, title, likes, dislikes, views, comments_json, now, now))
conn.commit()
conn.close()
return c.lastrowid

def update_video(video_id, publisher, title, likes, dislikes, views, comments, update_time):
conn = sqlite3.connect('../databases/videos.db')
c = conn.cursor()

# Get the current updated_at time
c.execute("SELECT updated_at FROM videos WHERE id = ?", (video_id,))
last_updated = c.fetchone()[0]

if update_time:
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
else:
now = last_updated

comments_json = json.dumps(comments)
c.execute("UPDATE videos SET publisher = ?, title = ?, likes = ?, dislikes = ?, views = ?, comments = ?, updated_at = ? WHERE id = ?",
(publisher, title, likes, dislikes, views, comments_json, now, video_id))
conn.commit()
conn.close()

return json.dumps(get_video(video_id))
Я пытался отслеживать статистику видео, сервер вроде работает, печатает правильные данные! Но после успешного выполнения кода 200 страница обновляется.
Вот JS, который я использую для взаимодействия с серверной частью:

Код: Выделить всё

var liked = false;
var disliked = false;
var followed = false;
var commentsOpen = false;
var url = window.location.search;
var urlParams = new URLSearchParams(url);
var id = urlParams.get("c");

var trackStatisticsRoute =
"http://localhost:5005/trackStatistics-Ue3ARmqbiF63KepjbxeI";

$(document).ready(function () {
if (id) {
document.title = "ByteClips - " + id;
}

var vidFile = "../videos/" + id + "/video.mp4";
var dataFile = "../videos/" + id + "/data.json";

console.log(vidFile);
$("#vidSrc").attr("src", vidFile);
$(".video")[0].load();

fetch(dataFile)
.then((response) => response.text())
.then((data) => {
data.id = id;
vidData = JSON.parse(data);
});

console.log("updateRating view");
updateRating("view", id);

$(".video-buttons div button").on("mouseenter", function () {
$(this).find("i").css("opacity", 0);
$(this).find(".counter").css("opacity", 1);
});

$(".video-buttons div button").on("mouseleave", function () {
$(this).find("i").css("opacity", 1);
$(this).find(".counter").css("opacity", 0);
});
});

function updateRating(action, id) {
const requestData = {
action: action,
id: id,
};

$.ajax({
type: "POST",
url: trackStatisticsRoute,
data: JSON.stringify(requestData),
contentType: "application/json",
success: function (data) {
// console.log('AJAX request successful', data);
// updateUI(data);
},
error: function (jqXHR, textStatus, errorThrown) {
// console.log('AJAX request error:', textStatus, errorThrown);
// console.log('Response:', jqXHR.responseText);
// alert('AJAX request failed.  Check console for details.');
console.log("womp womp");
},
});
}

function updateUI(data) {
let newData;
if (typeof data === "string"  || data instanceof String) {
newData = JSON.parse(data);
} else {
newData = data;
}
$("#like .counter").text(data["likes"]);
$("#dislike .counter").text(data["dislikes"]);
$("#share .counter").text(data["views"]);
$("#comment .counter").text(data["comments"].length);
}

if (liked) {
$("#like").css("background", "#fff");
$("#like").css("color", "#26daa5");
} else {
$("#like").css("background", "#26daa5");
$("#like").css("color", "#fff");
}
if (disliked) {
$("#dislike").css("background", "#fff");
$("#dislike").css("color", "#26daa5");
} else {
$("#dislike").css("background", "#26daa5");
$("#dislike").css("color", "#fff");
}
if (followed) {
$("#follow").css("background", "#fff");
$("#follow").css("color", "#26daa5");
$("#follow i").attr("class", "fa-solid fa-user-minus");
} else {
$("#follow").css("background", "#26daa5");
$("#follow").css("color", "#fff");
$("#follow i").attr("class", "fa-solid fa-user-plus");
}

$("#like").on("click", function () {
if (liked) {
// ons.notification.toast('Removed Like!', { timeout: 1000, animation: 'fall' });
liked = false;
$("#like").css("background", "#26daa5");
$("#like").css("color", "#fff");
console.log("updateRating unlike");
updateRating("unlike", id);
} else {
// ons.notification.toast('Liked!', { timeout: 1000, animation: 'fall' });
if (disliked) {
console.log("updateRating undislike");
updateRating("undislike", id);
}
liked = true;
disliked = false;
$("#like").css("background", "#fff");
$("#like").css("color", "#26daa5");
$("#dislike").css("background", "#26daa5");
$("#dislike").css("color", "#fff");
console.log("updateRating like");
updateRating("like", id);
}
});

$("#dislike").on("click", function () {
if (disliked) {
// ons.notification.toast('Removed Dislike!', { timeout: 1000, animation: 'fall' });
disliked = false;
$("#dislike").css("background", "#26daa5");
$("#dislike").css("color", "#fff");
console.log("updateRating undislike");
updateRating("undislike", id);
} else {
// ons.notification.toast('Disliked!', { timeout: 1000, animation: 'fall' });
if (liked) {
console.log("updateRating unlike");
updateRating("unlike", id);
}
disliked = true;
liked = false;
$("#dislike").css("background", "#fff");
$("#dislike").css("color", "#26daa5");
$("#like").css("background", "#26daa5");
$("#like").css("color", "#fff");
console.log("updateRating dislike");
updateRating("dislike", id);
}
});

$("#follow").on("click", function () {
if (followed) {
// ons.notification.toast('Unfollowed!', { timeout: 1000, animation: 'fall' });
followed = false;
$("#follow i").attr("class", "fa-solid fa-user-plus");
$("#follow").css("background", "#26daa5");
$("#follow").css("color", "#fff");
} else {
// ons.notification.toast('Followed!', { timeout: 1000, animation:  'fall' });
followed = true;
$("#follow i").attr("class", "fa-solid fa-user-minus");
$("#follow").css("background", "#fff");
$("#follow").css("color", "#26daa5");
}
});

$("#comment").on("click", function () {
console.log("comments opened");
if (commentsOpen) {
commentsOpen = false;
$("#comment").css("background", "#26daa5");
$("#comment").css("color", "#fff");
} else {
commentsOpen = true;
$("#comment").css("background", "#fff");
$("#comment").css("color", "#26daa5");
}
});
Это HTML:

Код: Выделить всё




ByteClips








Your browser does not support the video tag.




[i]
View



[/i]
0



[i][/i]
0



[i][/i]
0



[i][/i]
0



[i][/i]
0










Я открыл Fiddler Classic для отладки запросов и ответов, и вот некоторая информация:
Запрос:
POST http://localhost :5005/trackStatistics HTTP/1.1
Хост: localhost:5005
Соединение: поддержание активности
Длина контента: 26
сек-ch-ua: «Not)A;Бренд ";v="99", "Microsoft Edge";v="127", "Chromium";v="127"
Принять: /
sec-ch- ua-платформа: "Windows"
sec-ch-ua-mobile: ?0
Агент пользователя: {я подверг это цензуре
Тип контента: application/json
Происхождение : http://127.0.0.1:5500
Sec-Fetch-Site: межсайтовый
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: пустой
Referer : http://127.0.0.1:5500/
Кодировка принятия: gzip, deflate, br, zstd
Язык принятия: en-US,en;q=0.9
{"action":"view","id":"1"
Ответ:
HTTP/1.1 200 ОК
Сервер: Werkzeug /3.0.3 Python/3.12.4
Дата: среда, 31 июля 2024 г., 16:51:01 GMT
Тип контента: application/json
Длина контента: 200
Access-Control-Allow-Origin: http://127.0.0.1:5500
Варьируется: Origin
Соединение: закрыть
{
"комментарии" : "[]",
"create_at": "2024-07-30 23:30:05",
"не нравится": 0,
"id": 1,
"лайки": 0,
"издатель": "1",
"title": "Тест 1",
"updated_at": "2024-07-31 05:23: 12",
"просмотров": 108

да, я использую MS Edge, потому что у меня нет места для установки других браузеров, и вы можете' t uninstall Edge ._.
Я не знаю, как это воспроизвести, но думаю, что это я пытаюсь записать в файл SQL, используя sqlite3 внутри бэкэнда Flask. Я привел в этом вопросе весь код всей страницы, потому что я глупый.

Подробнее здесь: https://stackoverflow.com/questions/788 ... refreshing

Вернуться в «Python»