#javascript #html #jquery #flask #tinymce
Вопрос:
То, что я пытаюсь сделать:
- загрузите локальные изображения (005.jpg) из каталога клиента через TinyMCE (userprofile.html) в каталог моего локального хост-сервера
- сохраните «html» версию текстов и изображений внутри TinyMCE как 3_intro.txt
*в 005.jpg предполагается, что он будет сохранен как
img src=»./static/photo/userprofile_upload/005.jpg»
«.» находится в каталоге бета-версии, так как колба app.py помещается там
- Показывает, что 3_intro.txt на intro_trace.html с изображением(005.jpg) источник, на который ссылаются из каталога локального сервера
Проблема:
- Фактический img src, упомянутый в TinyMCE, и intro_trace.html отличается от каталога, который я настроил вручную, он становится :
img src=»static/photo/uploads/005.jpg» (без начального «./») (этот img src в представлении кода TinyMCE и 3_intro.txt это точно то же самое)
- В 005.jpg может быть показано в текстовом редакторе TinyMCE (включая представление кода, которое уже ссылается на изображение из каталога локального сервера моего хоста), но оно не может быть показано через intro_trace.html хотя у них один и тот же тег img src
- intro_trace.html возвращается с ошибкой «Не удалось загрузить ресурс: сервер ответил со статусом 404 (НЕ НАЙДЕН)»
Из того, что я видел через консоль ошибок, веб-сайт пытался получить изображение из http://localhost:5000/trace/static/photo/userprofile_upload/005.jpg в то время как он должен был быть получен из http://localhost:5000/static/photo/userprofile_upload/005.jpg (без следа) Это вызвано тем, что маршрут ввода /трассировка/ввод, поэтому он автоматически добавляет «/трассировку» в URL-адрес источника изображения.
How do I change the URL specifically so that the image won’t be sourced through the «/trace» URL?
Below, I provide some pictures as reference
Website Directory
/home | /dash | | /beta | | | app.py | | | /static | | | | /photo | | | | | /uploads | | | | | 005.jpg | | | | /introduction | | | | | 3_intro.txt | | | /templates | | | | intro_trace.html | | | | userprofile.html | | | /custom_modules | | | | user_profile.py | | | | /trace_gacp_modules | | | | | show_intro.py
app.py
app = Flask(__name__) app.register_blueprint(user_profile.user_profile) app.register_blueprint(show_intro.show_intro) @app.route('/userprofile', methods=['GET']) @required_login def userprofile(): if session.get("is_superuser") != 4: return render_template('userprofile.html') else: id = session.get("id") INFO = (g.session .query(db.models.INFO) .filter(db.models.INFO.id == id) .first()) file_name = str(id) "_intro.txt" intro_path = "./static/introduction/" file_name try: intro = open(intro_path, mode="r ", encoding='utf-8') with intro: intro_out = intro.read().replace('n', '').replace(''', '\'').replace( 'lt;pgt;lt;audio style="display: none;" controls="controls"gt;lt;/audiogt;lt;/pgt;', '') intro.close() except: intro_out = "" return render_template('userprofile.html', intro=intro_out) UPLOAD_FOLDER = 'static/photo/uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route("/upload", methods=["POST","GET"]) def upload(): if request.method == 'POST': file = request.files['file'] filename = secure_filename(file.filename) if file and allowed_file(file.filename): file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) print('File successfully uploaded ' file.filename ' to ' UPLOAD_FOLDER) else: print('Invalid Upload only png, jpg, jpeg, gif') return jsonify(filename)
user_profile.py
from flask import Blueprint, abort, g, session, request, jsonify, redirect from custom_modules.main_modules.decorators import required_login, required_user from custom_modules.main_modules import db, utils user_profile = Blueprint('user_profile', __name__) @user_profile.route('/api/intro', methods=['POST']) @required_user def introduction(): id = request.form.get('id') intro = request.form.get('intro') if intro is None: abort(405) file_name = str(id) "_intro.txt" intro_path = "./static/introduction/" file_name intro = open(intro_path, mode="w", encoding='utf-8') print(intro, file=intro) intro.close() (g.session .query(db.models.INFO) .filter(db.models.INFO.id == id) .update({"introduction": intro_path})) g.session.commit() return redirect('/userprofile')
userprofile.html
{% extends 'base/base.html' %} {% block page_content %} lt;divgt; lt;form method="post" action="/api/intro" enctype="multipart/form-data"gt; lt;input type="hidden" class="user-control" id="id" name="id" v-model="users.id"gt; lt;textarea id="intro_container" name="intro" maxlength="65535"gt;lt;/textareagt; lt;/formgt; lt;/divgt; {% endblock %} {% block page_script %} lt;script src="/static/tinymce/tinymce.min.js"gt;lt;/scriptgt; lt;scriptgt; tinymce.init({ selector: '#intro_container', plugins: "image code preview autoresize autosave save", toolbar: "undo redonewdocument bold italic underline strikethrough alignleft aligncenter alignright fontselect fontsizeselect forecolor backcolor image save | image_upload", image_caption: true, custom_colors: true, branding: false, image_class_list: [ {title: 'Responsive', value: 'img-responsive'} ], setup: function(picture) { var fileInput = $('lt;input id="tinymce-uploader" type="file" name="pic" accept="image/*" style="display:none"gt;'); $(picture.getElement()).parent().append(fileInput); fileInput.on("change",function(){ var file = this.files[0]; var reader = new FileReader(); var formData = new FormData(); var files = file; formData.append("file",files); formData.append('filetype', 'image'); jQuery.ajax({ url: "/upload", type: "post", data: formData, contentType: false, processData: false, async: false, success: function(response){ var fileName = response; if(fileName) { picture.insertContent('lt;img src="./static/photo/uploads/' fileName '"/gt;'); } } }); reader.readAsDataURL(file); }); picture.ui.registry.addButton('image_upload', { tooltip: 'Upload Image', text: 'Upload', onAction: function () { fileInput.trigger('click'); } }); } }); lt;/scriptgt;
show_intro.py
from flask import Blueprint, abort, g, request from custom_modules.main_modules.custom_render_templates import flask_render_template from custom_modules.main_modules import db show_farm_intro = Blueprint('show_intro', __name__) @show_farm_intro.route('/trace/intro', methods=['GET']) def trace_intro(): farm_id = request.args.get("no") if not id: abort(404) INFO = (g.session .query(db.models.INFO) .filter(db.models.INFO.id == int(id)) .first()) file_name = str(id) "_intro.txt" intro_path = "./static/introduction/" file_name try: intro = open(intro_path, mode="r ", encoding='utf-8') with intro: intro_out = intro.read().replace('n', '').replace(''', '\'').replace( 'lt;pgt;lt;audio style="display: none;" controls="controls"gt;lt;/audiogt;lt;/pgt;', '') intro.close() except: intro_out = "" return flask_render_template('intro_trace.html', name=INFO.name, intro=intro_out)
intro_trace.html
lt;div class="content-wrapper" style="margin-left:0px;"gt; lt;section class="content"gt; lt;div class="container"gt; lt;div class="row"gt; lt;div class="col-xs-12 text-center"gt; {% if name %} lt;h2gt;{{name}}lt;/h2gt; {% else %} lt;h2gt;Please register firstlt;/h2gt; {% endif %} lt;/divgt; lt;/divgt; lt;div class="row"gt; lt;div class="col-xs-12" id="intro_container"gt; lt;/divgt; lt;/divgt; lt;/divgt; lt;/sectiongt; lt;/divgt; lt;scriptgt; if ('{{intro}}'){ $("#intro_container").html('{{intro| safe}}') }else{ $("#intro_container").html('lt;h3gt;No Introlt;h3gt;') } lt;/scriptgt;