POST-запрос от Next.js к ошибке Flask CORSPython

Программы на Python
Ответить
Anonymous
 POST-запрос от Next.js к ошибке Flask CORS

Сообщение Anonymous »

Я совсем новичок в веб-разработке, и я застрял.
Я использую Flask и Nextjs для создания приложения, которое отображает сетку данных и позволяет пользователям делать примечания к данным. очков и отправить их обратно на сервер. Я могу отлично отображать данные, поэтому функция GET работает, но я добавил кнопку «Сохранить изменения», которая представляет собой запрос POST, и она продолжает выдавать мне CORS или 500 INTERNAL SERVER ERROR.
Прикрепил пару изображений с консоли и Сети. Дайте мне знать, если мне нужно добавить что-нибудь, что поможет с решением.
Вот мой текущий код. Закомментированные строки — это другие варианты решений CORS, которые я пробовал, но у меня не сработало.
Flask app.py

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

from flask import Flask, jsonify, request, make_response, Response
from flask_cors import CORS, cross_origin
import sqlalchemy as sa
import pandas as pd
import pyodbc
import json
from os import environ

app = Flask(__name__) # create app instance
# enable cors
cors = CORS(app, resources=r'/api/*', headers='Content-Type', origins='http://localhost:3000')
# app.config['CORS_HEADERS'] = 'Content-Type'

sqlalchemy_engine = 'connection string'
engine = sa.create_engine(sqlalchemy_engine, echo=False)

# create a route (api endpoint to get and post the data)
@app.route('/api/assetrentals', methods=['GET','POST','OPTIONS'])
@cross_origin(origin='*')
def asset_rental_data():
if request.method == 'GET':
# res = make_response('')
# res.headers.add('Access-Control-Allow-Origin', '*')
conn = engine.connect()
statement = sa.text("""
SELECT * FROM shortTermAssetRentals
""")
results = conn.execute(statement)
df = pd.DataFrame(results)
df['rental_start_date'] = df['rental_start_date'].astype(str)
df['rental_end_date'] = df['rental_end_date'].astype(str)
df.sort_values(by=['rental_start_date','ra_number'], axis=0, ascending=False, inplace=True, ignore_index=True)
return jsonify(json.loads(df.to_json(orient='records')))
elif request.method == 'POST':
# res = make_response('')
# res.headers.add('Access-Control-Allow-Origin', '*')

# Just trying to display the data first, then worry about sending to server
print(request.get_json())

else:
# res = make_response('')
# res.headers.add('Access-Control-Allow-Origin', '*')
return 'Error'

# code required to run the app
# remove debug=True from production
if __name__ == '__main__':
app.run(debug=True, port=8080)

# to run the app in terminal: python app.py
Вот моя сетка Nextjs

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

'use client';
import React, { useState, useEffect } from 'react';
import { AgGridReact } from 'ag-grid-react';
import { ColDef } from 'ag-grid-community'
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-quartz.css';
import { Button } from '@headlessui/react';
import { CheckCircleIcon } from '@heroicons/react/16/solid';
import NextCors from 'nextjs-cors';

const Grid: React.FC = () =>  {

interface AssetRentals {
ra_number: string;
unit: string;
rental_type_custom: string;
lease_unit_custom: string;
notes_custom: string;
lease_unit: string;
status: string;
vendor: string;
rental_type: string;
unit_type: string;
unit_description: string;
service_center: string;
region: string;
vendor_location: string;
rental_start_date: string;
rental_end_date: string;
days_used: number;
};

const [colDefs, setColDefs] = useState([
{ field: 'ra_number', headerName: 'RA Number', filter: true, sortable: true, editable: false },
{ field: 'unit', headerName: 'Unit', filter: true, sortable: true, editable: false },
{ field: 'rental_type_custom', headerName: 'Rental Type (Custom)', filter: true, sortable: true, editable: true },
{ field: 'lease_unit_custom', headerName: 'Lease Unit (Custom)', filter: true, sortable: true, editable: true },
{ field: 'notes_custom', headerName: 'Notes (Custom)', filter: true, sortable: true, editable: true },
{ field: 'lease_unit', headerName: 'Lease Unit', filter: true, sortable: true, editable: false },
{ field: 'status', headerName: 'Status', filter: true, sortable: true, editable: false },
{ field: 'vendor', headerName: 'Vendor', filter: true, sortable: true, editable: false },
{ field: 'rental_type', headerName: 'Rental Type', filter: true, sortable: true, editable: false },
{ field: 'unit_type', headerName: 'Unit Type', filter: true, sortable: true, editable: false },
{ field: 'unit_description', headerName: 'Unit Description', filter: true, sortable: true, editable: false },
{ field: 'service_center', headerName: 'Service Center', filter: true, sortable: true, editable: false },
{ field: 'region', headerName: 'Region', filter: true, sortable: true, editable: false },
{ field: 'vendor_location', headerName: 'Vendor Location', filter: true, sortable: true, editable: false },
{ field: 'rental_start_date', headerName: 'Rental Start Date', filter: true, sortable: true, editable: false },
{ field: 'rental_end_date', headerName: 'Rental End Date', filter: true, sortable: true, editable: false },
{ field: 'days_used', headerName: 'Days Used', filter: true, sortable: true, editable: false },
]);

const [rowData, setRowData] = useState([]);

useEffect(() => {
fetch('http://localhost:8080/api/assetrentals', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
}, })
.then(response => response.json())
.then((data) => {
setRowData(data)
});
}, []);

const updateData = async () => {
try {
const res = await fetch('http://localhost:8080/api/assetrentals', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify({rowData}),
});

if (!res.ok) {
throw new Error('Something went wrong');
}

const jsonData = await res.json();
setRowData(jsonData);
} catch (error) {
console.error('Something went wrong:', error);
}
};

return (



Save Changes





)
}

export default Grid;
Вот моя страница Nextjs

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

import React from 'react';
import type { Metadata } from 'next'
import Grid from './grid';

export const metadata: Metadata = {
title: "Data Portal | Asset Rentals",
description: 'Short Term Asset Rentals',
};

export default function page() {
return (



)
}
Конфигурация Nextjs

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

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
/* config options here */
};

export default nextConfig;

module.exports = {
crossOrigin: 'anonymous',
}
Изображение

< img alt="Заголовки запроса и ответа" src="https://i.sstatic.net/fzy8kDG6.png" />

Подробнее здесь: https://stackoverflow.com/questions/791 ... cors-error
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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