pallets-eco / flask-admin

Simple and extensible administrative interface framework for Flask
https://flask-admin.readthedocs.io
BSD 3-Clause "New" or "Revised" License
5.73k stars 1.57k forks source link

404 error for POST request method #1678

Open bekab95 opened 6 years ago

bekab95 commented 6 years ago

I am trying to integrate ckeditor image upload method

@app.route('/files/') @csrf.exempt def uploaded_files(filename): path = app.config['UPLOADED_PATH'] return send_from_directory(path, filename)

import uuid

@app.route('/upload', methods=['POST']) @csrf.exempt def upload(): f = request.files.get('upload') extension = f.filename.split('.')[1].lower() if extension not in ['jpg', 'gif', 'png', 'jpeg']: return upload_fail(message='Image only!') unique_filename = str(uuid.uuid4()) f.filename = unique_filename + '.' + extension f.save(os.path.join(app.config['UPLOADED_PATH'], f.filename)) url = url_for('uploaded_files', filename=f.filename) return upload_success(url=url)

flask admin is giving me 404 error for this POST method (if I implement it in base app it will not) why ?

ljluestc commented 3 months ago

from flask import Flask, request, send_from_directory, url_for
from flask_wtf import FlaskForm
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.fileadmin import FileAdmin
from flask_admin.form.upload import ImageUploadField
from wtforms import StringField
from werkzeug.utils import secure_filename
import os
import uuid

app = Flask(__name__)
app.secret_key = 'your_secret_key_here'
app.config['UPLOADED_PATH'] = 'uploads'

class CKEditorImageUploadForm(FlaskForm):
    upload = ImageUploadField('Image')

@app.route('/files/<filename>')
def uploaded_files(filename):
    path = app.config['UPLOADED_PATH']
    return send_from_directory(path, filename)

@app.route('/upload', methods=['POST'])
def upload():
    f = request.files.get('upload')
    if f:
        extension = f.filename.split('.')[1].lower()
        if extension not in ['jpg', 'gif', 'png', 'jpeg']:
            return upload_fail(message='Image only!')
        unique_filename = str(uuid.uuid4())
        filename = secure_filename(unique_filename + '.' + extension)
        f.save(os.path.join(app.config['UPLOADED_PATH'], filename))
        url = url_for('uploaded_files', filename=filename)
        return upload_success(url=url)
    return upload_fail(message='No file uploaded')

def upload_success(url):
    # Customize success response if needed
    return f'<script>window.parent.CKEDITOR.tools.callFunction(1, "{url}", "");</script>'

def upload_fail(message):
    # Customize failure response if needed
    return f'<script>window.parent.CKEDITOR.tools.callFunction(1, "", "{message}");</script>'

# Flask-Admin setup
admin = Admin(app)
admin.add_view(FileAdmin(app.config['UPLOADED_PATH'], '/files/', name='Uploaded Files'))

if __name__ == '__main__':
    app.run(debug=True)