Flask url_for 'static' ในโฟลเดอร์เทมเพลต?

อาจมีวิธีที่ดีกว่าในการทำเช่นนี้ แต่ฉันกำลังพยายามจัดระเบียบแอปพลิเคชัน Flask ของฉันเพื่อให้ ทั้งเทมเพลต Javascript และ HTML แบบคงที่อยู่ในโฟลเดอร์เดียวกัน (คล้ายกับส่วนประกอบ)

นี่เป็นเพียงเพื่อวัตถุประสงค์ขององค์กร ฉันจะไม่เรนเดอร์สถิติใน jinja2

ดังนั้นแทนที่จะเป็นสิ่งนี้:

├── templates/
│   ├── login.html
├── static/
│   ├── login.js

ฉันกำลังมองหาสิ่งนี้ (เป็นเพียงความคิด):

├── components/
│   ├── login/
│   │   ├── login.html
│   │   └── login.js

หรืออาจเป็นเช่นนี้ ฉันจึงสามารถสร้าง wrapper ที่แสดงส่วนประกอบโดยใช้ชื่อโฟลเดอร์ได้ เช่น: return render_component('login')

├── components/
│   ├── login/
│   │   ├── template.html
│   │   └── login.js

แนวคิดก็คือภายในเทมเพลต login.html จะเพิ่ม แท็กสคริปต์ ด้วย url_for ถึง login.js

ฉันยังเปิดรับแนวคิด/วิธีต่างๆ เพื่อให้บรรลุโครงสร้างองค์ประกอบนี้ด้วย


person Mojimi    schedule 28.06.2019    source แหล่งที่มา
comment
ดังนั้นเทมเพลตของคุณจะสามารถเข้าถึงได้ในรูปแบบไฟล์คงที่ ทำไมไม่มีสคริปต์เริ่มต้นที่จะคัดลอกไฟล์คงที่จากโฟลเดอร์ templates ของคุณไปยังโฟลเดอร์ static   -  person Avm-x    schedule 28.06.2019
comment
เข้าถึงได้โดยใคร? นักพัฒนา? นั่นไม่เป็นไรสำหรับฉัน   -  person Mojimi    schedule 28.06.2019


คำตอบ (2)


ฉันแน่ใจว่ามีวิธีอื่นในการบรรลุเป้าหมายนี้ แต่วิธีหนึ่งคือการใช้โครงสร้างพิมพ์เขียวและมีไฟล์คงที่ทั้งหมดสำหรับพิมพ์เขียวเฉพาะนั้นภายในโฟลเดอร์พิมพ์เขียว

app
|- collections
|    - blueprint_one
|        - configs
|        - static
|           - css
|           - js
|              js_file_one.js
|        - templates
|           - blueprint_one
|              html_file_one.html
|        blue_print_one_view_file_one.py
|        __init__.py   
|    - blueprint_two
|    - blueprint_three
|- static
|    - js
|    - css 
|- templates
__init__.py

โครงสร้างโฟลเดอร์ด้านบนช่วยให้คุณสามารถแยกไม่เพียงแต่ไฟล์แบบคงที่ แต่ยังรวมถึงไฟล์มุมมอง Flask ด้วย

ด้านล่างนี้เป็นตัวอย่างของการเปิดใช้งาน/นำเข้าไฟล์:

1) app/init.py

app = Flask(__name__, static_folder='static')
app.config.from_pyfile('app_config.py')
# Do all your db set up and etcs..
# Import blueprints below set ups to prevent circular import
app.collections.blueprint_one import blueprint_one
app.collections.blueprint_two import blueprint_two
# Now register blueprints that you've imported
app.register_blueprint(blueprint_one, url_prefix='/blueprint_one')
app.register_blueprint(blueprint_two, url_prefix='/blueprint_two')

2) blueprint_one/init.py

# Create a blueprint
from flask import Blueprint
blueprint_one = Blueprint('blueprint_one_name', __name__, template_folder='templates', static_folder='static')
# Import required views to use
from . import blue_print_one_view_file_one.py

3) blueprint_one/blue_print_one_view_file_one.py

# Import blueprint
from app.collections.blueprint_one import blueprint_one
# Any view functions using above blueprint 
@blueprint_one.route('/login/, methods=['GET'])
def login():
    return render_template('blueprint_one/html_file_one.html')

4) blueprint_one/templates/blueprint_one/html_file_one.html

// Note: instead of .static, you can use blueprint_one.static.
<script type="text/javascript" src="{{ url_for('.static', filename = 'js/js_file_one.js') }}"></script>

5) app/static และ app/templates ยังคงสามารถใช้งานได้ในขณะที่คุณใช้งานอยู่ในปัจจุบัน

โซลูชันนี้ไม่ได้แก้ปัญหาการวาง js และ html ลงในโฟลเดอร์เดียวกัน แต่อย่างน้อยคุณก็สามารถแบ่งแต่ละคุณลักษณะออกเป็นส่วนประกอบ เช่น พิมพ์เขียว เพื่อโครงสร้างโปรเจ็กต์แบบโมดูลาร์มากขึ้น

person Jessi    schedule 28.06.2019

ไม่มีวิธีที่ดีที่สุดในการทำเช่นนี้ ฉันจึงขอแนะนำให้คุณทบทวนวิธีการตั้งค่าโปรเจ็กต์ขวด

http://flask.pocoo.org/docs/1.0/tutorial/layout/< /ก>

ฉันคิดว่าคำถามนี้อาจมีคำตอบที่ช่วยแก้ปัญหาของคุณได้ที่นี่

Flask url_for URL ใน Javascript

ต่อไปนี้เป็นความคิดบางประการ สำหรับฉันดูเหมือนว่าคุณต้องการใช้ Templating ในไฟล์ที่อยู่ในโฟลเดอร์คงที่ของคุณ นี่ไม่ใช่สิ่งที่โฟลเดอร์คงที่มีไว้สำหรับ คงที่หมายถึงไม่มีการเปลี่ยนแปลง ดังนั้นไฟล์ในโฟลเดอร์คงที่ของคุณจึงไม่ควรเปลี่ยนแปลง เทมเพลตได้รับการออกแบบให้เป็นไดนามิก ซึ่งมักจะหมายความว่ามีการเปลี่ยนแปลง หากคุณวางแผนที่จะเรนเดอร์เทมเพลตจากไฟล์ในไดเร็กทอรีแบบคงที่ของคุณ คุณจะพบกับปัญหามากมายและอาจจะไม่สามารถทำได้ด้วยซ้ำ ปัญหาที่โดดเด่นที่สุดประการหนึ่งที่คุณอาจพบคือเบราว์เซอร์จะไม่ต้องการรับไฟล์จาวาสคริปต์ใหม่หากคิดว่าไฟล์เหล่านั้นอยู่ในไดเร็กทอรีแบบคงที่ของคุณ เบราว์เซอร์อาจถือว่าไม่มีการเปลี่ยนแปลง นอกจากนี้ Flask ยังทำเวทย์มนตร์เบื้องหลังอีกด้วย เมื่อ URL สำหรับไฟล์ในไดเร็กทอรีแบบคงที่ของคุณได้รับการประมวลผลจากไคลเอนต์ที่ร้องขอไฟล์ flask แล้วจะส่งกลับ HTTP CODE 304 ซึ่งโดยพื้นฐานแล้วหมายถึง "ไฟล์ไม่มีการเปลี่ยนแปลง"

ฉันสามารถพูดต่อไปได้ว่าทำไมคุณไม่ควรทำเช่นนี้ หากไม่มีข้อมูลข้างต้นใดที่สามารถแก้ปัญหาของคุณได้ ฉันขอแนะนำให้คุณวางเทมเพลต JavaScript ไว้ในไดเร็กทอรีย่อยของไดเร็กทอรีเทมเพลตของคุณ จากนั้นใช้รหัสต่อไปนี้เพื่อส่งคืน

@app.route('/js/<file_name>',methods=['GET'])
def get_js_templates(file_name):
    return render_template('js/'+file_name)

ฉันไม่ได้เป็นผู้เชี่ยวชาญในความสามารถใดๆ แต่ฉันได้พัฒนาสแต็กเต็มรูปแบบโดยใช้เฟรมเวิร์กเว็บขวด หากคุณมีคำถามเพิ่มเติมแสดงความคิดเห็นในโพสต์นี้

person West    schedule 28.06.2019
comment
ฉันไม่ได้พยายามแสดงสถิติของฉัน ทั้งหมดที่ฉันต้องการคือให้พวกเขานั่งในโฟลเดอร์เดียวกันกับ html สำหรับองค์กรเท่านั้น จริงๆ แล้วทุกอย่างก็เหมือนกัน - person Mojimi; 28.06.2019
comment
ถ้าอย่างนั้นฉันก็ไม่รู้ว่าคุณถามอะไร ทุกสิ่งที่คุณใส่ในไดเร็กทอรีแบบคงที่ของคุณสามารถเข้าถึงได้ด้วย url_for('static','sub_directory/file_name.file_extension') ซึ่งสร้าง URL ที่คล้ายกับ current_domain/static/sub_domain/file_name.file_extension ต่อไปนี้ และส่งคืนไฟล์ raw หากมี เปลี่ยนแปลงไปตั้งแต่ครั้งล่าสุดที่ผู้ร้องขอร้องขอ - person West; 28.06.2019