CherryPy দিয়ে ওয়েব অ্যাপ্লিকেশন তৈরি করার সময়, স্ট্যাটিক ফাইল (যেমন CSS, JavaScript, ইমেজ) এবং মিডিয়া ফাইল (যেমন ডকুমেন্টস, ভিডিও, অডিও) সঠিকভাবে পরিবেশন করা অত্যন্ত গুরুত্বপূর্ণ। CherryPy সেগুলি সহজে পরিচালনা করতে সক্ষম, এবং এতে রয়েছে স্ট্যাটিক ফাইল সার্ভিংয়ের জন্য বিল্ট-ইন টুলস।
CherryPy তে Static Files Management
Static files হল সেগুলি যেগুলি ওয়েব সার্ভারের মাধ্যমে সরাসরি ক্লায়েন্টে পাঠানো হয় এবং এগুলিতে সাধারণত কোনো ডায়নামিক পরিবর্তন করা হয় না। সাধারণ উদাহরণ হলো CSS, JavaScript, ইমেজ ফাইল।
CherryPy তে স্ট্যাটিক ফাইল পরিবেশন করতে tools.staticdir টুল ব্যবহার করা হয়। এই টুলটি স্ট্যাটিক ফাইলের লোকেশন সঠিকভাবে নির্ধারণ করে এবং ক্লায়েন্টের কাছে পরিবেশন করে।
উদাহরণ: স্ট্যাটিক ফাইল পরিবেশন করা
import cherrypy
class StaticFileServer:
@cherrypy.expose
def index(self):
return "স্ট্যাটিক ফাইল পরিবেশন উদাহরণ"
# কনফিগারেশন
config = {
'/static': {
'tools.staticdir.on': True, # স্ট্যাটিক ফাইল সক্রিয় করা
'tools.staticdir.dir': './static', # স্ট্যাটিক ফাইলের লোকেশন
'tools.staticdir.content_types': {
'css': 'text/css',
'js': 'application/javascript',
'jpg': 'image/jpeg',
'png': 'image/png',
}
}
}
if __name__ == '__main__':
cherrypy.quickstart(StaticFileServer(), '/', config)
এখানে:
tools.staticdir.on: স্ট্যাটিক ফাইল সার্ভিং সক্রিয় করা।tools.staticdir.dir: স্ট্যাটিক ফাইলের ডিরেক্টরি নির্ধারণ করা, এখানে./staticফোল্ডার থেকে ফাইল সরবরাহ করা হচ্ছে।tools.staticdir.content_types: স্ট্যাটিক ফাইলের MIME টাইপ কনফিগার করা, যাতে ব্রাউজার সঠিকভাবে ফাইলগুলো রেন্ডার করতে পারে।
স্ট্যাটিক ফাইল কাঠামো:
project/
│
├── app.py
├── static/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ └── script.js
│ └── images/
│ └── logo.png
CherryPy তে Media Files Management
Media files হল বড় ফাইল (যেমন ভিডিও, অডিও, পিডিএফ বা অন্য কোনো বৃহৎ ফাইল) যেগুলি ইউজারদের কাছে ডাউনলোড বা স্ট্রিম করা হয়। CherryPy তে মিডিয়া ফাইল পরিবেশন করার জন্যও স্ট্যাটিক ফাইল সার্ভিংয়ের মতোই tools.staticdir টুল ব্যবহার করা যেতে পারে, তবে এখানে ডাউনলোডের জন্য অতিরিক্ত কনফিগারেশন থাকতে পারে।
উদাহরণ: মিডিয়া ফাইল পরিবেশন
import cherrypy
class MediaFileServer:
@cherrypy.expose
def index(self):
return "মিডিয়া ফাইল পরিবেশন উদাহরণ"
# কনফিগারেশন
config = {
'/media': {
'tools.staticdir.on': True, # মিডিয়া ফাইল সক্রিয় করা
'tools.staticdir.dir': './media', # মিডিয়া ফাইলের লোকেশন
'tools.staticdir.content_types': {
'mp4': 'video/mp4',
'mp3': 'audio/mp3',
'pdf': 'application/pdf',
}
}
}
if __name__ == '__main__':
cherrypy.quickstart(MediaFileServer(), '/', config)
এখানে:
tools.staticdir.on: মিডিয়া ফাইল পরিবেশন সক্রিয় করা।tools.staticdir.dir: মিডিয়া ফাইলের ডিরেক্টরি নির্ধারণ করা, এখানে./mediaফোল্ডার থেকে ফাইল সরবরাহ করা হচ্ছে।tools.staticdir.content_types: মিডিয়া ফাইলের MIME টাইপ কনফিগার করা (যেমন.mp4,.mp3,.pdfফাইলের জন্য উপযুক্ত টাইপস)।
মিডিয়া ফাইল কাঠামো:
project/
│
├── app.py
├── media/
│ ├── video/
│ │ └── example.mp4
│ ├── audio/
│ │ └── example.mp3
│ └── docs/
│ └── example.pdf
Static এবং Media Files এর পার্থক্য
| বৈশিষ্ট্য | স্ট্যাটিক ফাইল (Static Files) | মিডিয়া ফাইল (Media Files) |
|---|---|---|
| উদাহরণ | CSS, JavaScript, Images | ভিডিও, অডিও, ডকুমেন্ট |
| সাইজ | সাধারণত ছোট | সাধারণত বড় (বহু MB অথবা GB) |
| ব্যবহার | ওয়েব পেজের ডিজাইন এবং ফিচার | ভিডিও/অডিও স্ট্রিমিং বা ডাউনলোড |
| স্টোরেজ ও পরিবেশন | সাইটের লুক এবং অনুভূতির জন্য | ইউজারের ডাউনলোড বা স্ট্রিমিং |
CherryPy তে File Upload Handling
CherryPy তে ফাইল আপলোডের জন্য cherrypy.request.params ব্যবহার করা হয়। এখানে ব্যবহারকারী ফাইল আপলোড করে এবং সেটি সার্ভারে সেভ করা হয়।
উদাহরণ: ফাইল আপলোড
import cherrypy
class FileUpload:
@cherrypy.expose
def index(self):
return '''
<html>
<body>
<h2>ফাইল আপলোড করুন</h2>
<form method="POST" action="/upload" enctype="multipart/form-data">
ফাইল: <input type="file" name="file"><br><br>
<input type="submit" value="আপলোড">
</form>
</body>
</html>
'''
@cherrypy.expose
def upload(self, file):
upload_path = './uploads/'
with open(upload_path + file.filename, 'wb') as out:
out.write(file.file.read())
return f"ফাইলটি সফলভাবে আপলোড করা হয়েছে: {file.filename}"
if __name__ == '__main__':
cherrypy.quickstart(FileUpload())
এখানে:
enctype="multipart/form-data"ফর্ম অ্যাট্রিবিউটের মাধ্যমে ফাইল আপলোড করা হয়।file.filenameএবংfile.file.read()ব্যবহার করে ফাইলটি সেভ করা হয়।
CherryPy তে স্ট্যাটিক ফাইল এবং মিডিয়া ফাইল ব্যবস্থাপনা খুবই সহজ এবং কার্যকর। tools.staticdir টুলটি স্ট্যাটিক এবং মিডিয়া ফাইল সার্ভিংয়ের জন্য ব্যবহৃত হয়। এতে আপনি সহজেই সঠিক ফাইল টাইপ কনফিগার করতে পারেন এবং বিভিন্ন ফাইল সাইজ এবং টাইপের ফাইল পরিবেশন করতে পারেন। CherryPy আপনাকে ফাইল আপলোড, স্ট্যাটিক এবং মিডিয়া ফাইল পরিষেবার ক্ষেত্রে পুরোপুরি নিয়ন্ত্রণ দেয়, যা আপনার অ্যাপ্লিকেশন পরিচালনা এবং সম্প্রসারণে সাহায্য করবে।
CherryPy দিয়ে স্ট্যাটিক ফাইল (যেমন CSS, JavaScript, ইমেজ) এবং মিডিয়া ফাইল (যেমন ভিডিও, অডিও, ডকুমেন্ট) সহজে সার্ভ করা যায়। CherryPy নিজে স্ট্যাটিক ফাইল হ্যান্ডলিংয়ের জন্য একটি বিল্ট-ইন টুল সরবরাহ করে। আপনি নির্দিষ্ট URL রুটের মাধ্যমে স্ট্যাটিক এবং মিডিয়া ফাইল সার্ভ করতে পারেন।
স্ট্যাটিক ফাইল এবং মিডিয়া ফাইলের মধ্যে পার্থক্য
- স্ট্যাটিক ফাইল (Static Files): সাধারণত ফিক্সড কন্টেন্ট যেমন CSS, JavaScript, এবং ইমেজ ফাইল (PNG, JPG, GIF)।
- মিডিয়া ফাইল (Media Files): ফাইলগুলি ডাইনামিক হতে পারে, যেমন ভিডিও, অডিও, ডকুমেন্ট বা অন্যান্য বড় ফাইল যা ওয়েব ব্রাউজারে পরিবেশন করা হয়।
CherryPy স্ট্যাটিক ফাইলের জন্য বিল্ট-ইন টুল সরবরাহ করে, এবং মিডিয়া ফাইল সার্ভিংয়ের জন্য কিছু কাস্টম কনফিগারেশন বা টুলস ব্যবহার করা যেতে পারে।
Static Files Serve করা
CherryPy তে স্ট্যাটিক ফাইল সার্ভ করতে tools.staticdir টুল ব্যবহার করা হয়। এই টুল দিয়ে আপনি স্ট্যাটিক ফাইলের লোকেশন নির্ধারণ করতে পারেন এবং সেই অনুযায়ী ফাইলগুলো অ্যাক্সেসযোগ্য হবে।
উদাহরণ: স্ট্যাটিক ফাইল সার্ভিং
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপে!"
if __name__ == '__main__':
# স্ট্যাটিক ফাইলের লোকেশন এবং সেকশন কনফিগার করা
config = {
'/static': {
'tools.staticdir.on': True, # স্ট্যাটিক ফাইল সার্ভিং চালু
'tools.staticdir.dir': './static', # স্ট্যাটিক ফাইলের লোকেশন
'tools.staticdir.content_types': {'css': 'text/css', 'js': 'application/javascript'}
}
}
cherrypy.quickstart(MyApp(), '/', config)
এখানে:
/staticরুটের জন্য স্ট্যাটিক ফাইল সার্ভিং কনফিগার করা হয়েছে।tools.staticdir.dirএ স্ট্যাটিক ফাইলের লোকেশন নির্ধারণ করা হয়েছে (যেমন./staticডিরেক্টরি)।
ফাইল কাঠামো:
project/
│
├── app.py
├── static/
│ ├── styles.css
│ ├── script.js
│ └── logo.png
এখন, যদি আপনি ব্রাউজারে http://127.0.0.1:8080/static/styles.css যান, তাহলে আপনি স্ট্যাটিক CSS ফাইলটি দেখতে পাবেন।
Media Files Serve করা
মিডিয়া ফাইল সার্ভ করতে আপনি কাস্টম টুলস ব্যবহার করতে পারেন, যেমন বড় ভিডিও বা অডিও ফাইলের জন্য streaming অথবা নির্দিষ্ট কনফিগারেশন করতে পারেন যাতে মিডিয়া ফাইলগুলো ব্রাউজারে সঠিকভাবে লোড হয়।
উদাহরণ: মিডিয়া ফাইল সার্ভিং
import cherrypy
import os
class MediaServer:
@cherrypy.expose
def index(self):
return "মিডিয়া ফাইল সার্ভিং"
@cherrypy.expose
def serve_video(self, filename):
video_path = os.path.join('media', filename)
# মিডিয়া ফাইলের অবস্থান চেক
if os.path.exists(video_path):
cherrypy.response.headers['Content-Type'] = 'video/mp4'
cherrypy.response.headers['Content-Disposition'] = f'attachment; filename={filename}'
with open(video_path, 'rb') as video:
return video.read()
else:
return "ফাইলটি পাওয়া যায়নি"
if __name__ == '__main__':
# মিডিয়া ফাইল সার্ভিং কনফিগারেশন
cherrypy.quickstart(MediaServer())
এখানে:
serve_videoমেথডটি ভিডিও ফাইলের জন্য। এটি মিডিয়া ফাইলের লোকেশন থেকে ভিডিও ফাইলের কন্টেন্ট পাঠায়।Content-Typeহেডারটি ব্যবহার করা হয়েছে ভিডিও ফাইলের MIME টাইপ নির্ধারণ করার জন্য, যেমনvideo/mp4।
ফাইল কাঠামো:
project/
│
├── app.py
├── media/
│ ├── video.mp4
│ └── audio.mp3
এখন, আপনি ব্রাউজারে http://127.0.0.1:8080/serve_video/video.mp4 দিয়ে ভিডিওটি দেখতে বা ডাউনলোড করতে পারবেন।
স্ট্যাটিক ফাইল এবং মিডিয়া ফাইল সার্ভিং কনফিগারেশন
CherryPy তে স্ট্যাটিক এবং মিডিয়া ফাইলের জন্য কনফিগারেশন একসাথে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আপনি স্ট্যাটিক ফাইল সার্ভিং এবং মিডিয়া ফাইল সার্ভিং একসাথে কনফিগার করতে পারেন:
import cherrypy
import os
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপে!"
@cherrypy.expose
def serve_video(self, filename):
video_path = os.path.join('media', filename)
if os.path.exists(video_path):
cherrypy.response.headers['Content-Type'] = 'video/mp4'
cherrypy.response.headers['Content-Disposition'] = f'attachment; filename={filename}'
with open(video_path, 'rb') as video:
return video.read()
else:
return "ফাইলটি পাওয়া যায়নি"
if __name__ == '__main__':
config = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static',
'tools.staticdir.content_types': {'css': 'text/css', 'js': 'application/javascript'}
},
'/media': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './media',
'tools.staticdir.content_types': {'mp4': 'video/mp4', 'mp3': 'audio/mp3'}
}
}
cherrypy.quickstart(MyApp(), '/', config)
এখানে:
/staticরুটের জন্য স্ট্যাটিক ফাইল সার্ভিং কনফিগার করা হয়েছে।/mediaরুটের জন্য মিডিয়া ফাইল সার্ভিং কনফিগার করা হয়েছে।
এটি স্ট্যাটিক এবং মিডিয়া ফাইল উভয়ই সার্ভ করতে সক্ষম হবে।
CherryPy দিয়ে স্ট্যাটিক এবং মিডিয়া ফাইল সার্ভিং করা সহজ। CherryPy এর tools.staticdir টুল ব্যবহার করে স্ট্যাটিক ফাইল এবং কাস্টম কনফিগারেশন ব্যবহার করে মিডিয়া ফাইল সার্ভ করা যায়। আপনি যেকোনো ধরনের ফাইল সার্ভ করতে CherryPy ব্যবহার করতে পারেন, যা আপনাকে একটি পূর্ণাঙ্গ ওয়েব অ্যাপ্লিকেশন তৈরিতে সহায়তা করবে।
CherryPy দিয়ে ওয়েব অ্যাপ্লিকেশন তৈরি করার সময়, CSS, JavaScript এবং Images স্ট্যাটিক ফাইল হিসেবে পরিবেশন করা অত্যন্ত গুরুত্বপূর্ণ। স্ট্যাটিক ফাইলগুলির মাধ্যমে আপনি আপনার ওয়েব পেজের ডিজাইন, ইন্টারেক্টিভিটি এবং মিডিয়া উপাদানগুলিকে রিচ করতে পারেন। CherryPy এ স্ট্যাটিক ফাইলগুলিকে সহজভাবে সিস্টেমে সংযুক্ত এবং পরিবেশন করা যায়।
CherryPy তে স্ট্যাটিক ফাইল সংযোগ
CherryPy তে স্ট্যাটিক ফাইল (CSS, JS, images) সার্ভ করার জন্য tools.staticdir টুল ব্যবহার করা হয়। এতে আপনি স্ট্যাটিক ফাইলগুলির জন্য পাথ নির্ধারণ করতে পারেন এবং CherryPy ওই ফাইলগুলো ক্লায়েন্টের কাছে সরবরাহ করবে।
১. স্ট্যাটিক ফাইল পরিবেশন করা
CherryPy তে স্ট্যাটিক ফাইল পরিবেশন করতে tools.staticdir টুল ব্যবহার করা হয়, যা আপনাকে স্ট্যাটিক ফাইলগুলির পাথ এবং কনফিগারেশন সেট করার সুবিধা দেয়।
উদাহরণ: CherryPy তে CSS, JS এবং Images সংযোগ করা
ধরি আপনার অ্যাপ্লিকেশন কাঠামো এমন:
project/
│
├── app.py
├── static/
│ ├── css/
│ │ └── styles.css
│ ├── js/
│ │ └── script.js
│ └── images/
│ └── logo.png
এখন CherryPy তে স্ট্যাটিক ফাইলগুলো পরিবেশন করার জন্য কোড তৈরি করতে হবে।
উদাহরণ কোড:
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return '''
<html>
<head>
<link rel="stylesheet" href="/static/css/styles.css">
<script src="/static/js/script.js"></script>
</head>
<body>
<h1>স্বাগতম CherryPy অ্যাপে!</h1>
<img src="/static/images/logo.png" alt="Logo">
</body>
</html>
'''
# স্ট্যাটিক ফাইল সার্ভিং কনফিগারেশন
config = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static' # স্ট্যাটিক ফাইলের লোকেশন
}
}
if __name__ == '__main__':
cherrypy.quickstart(MyApp(), '/', config)
ব্যাখ্যা:
tools.staticdir.on: এটি স্ট্যাটিক ফাইল সার্ভিং চালু করে।tools.staticdir.dir: এটি স্ট্যাটিক ফাইলগুলির জন্য ডিরেক্টরি নির্ধারণ করে। এখানে./staticডিরেক্টরি ব্যবহার করা হয়েছে।- HTML টেমপ্লেট:
indexমেথডে HTML টেমপ্লেট তৈরি করা হয়েছে এবং CSS, JavaScript, এবং Image ফাইলগুলো যথাক্রমে<link>,<script>, এবং<img>ট্যাগের মাধ্যমে লিংক করা হয়েছে।
২. স্ট্যাটিক ফাইল কনফিগারেশন
CherryPy তে আপনি tools.staticdir টুলের মাধ্যমে একাধিক স্ট্যাটিক ফাইলের পাথ নির্ধারণ করতে পারেন।
উদাহরণ: একাধিক পাথ কনফিগার করা
config = {
'/static/css': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static/css'
},
'/static/js': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static/js'
},
'/static/images': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static/images'
}
}
এতে, CSS, JS এবং Images ফাইলগুলো আলাদা আলাদা সাব-রুট দিয়ে সঠিকভাবে সার্ভ করা হবে:
/static/css: CSS ফাইল/static/js: JS ফাইল/static/images: Images ফাইল
৩. স্ট্যাটিক ফাইলের অ্যাক্সেস কন্ট্রোল
CherryPy তে আপনি স্ট্যাটিক ফাইলের অ্যাক্সেস কন্ট্রোলও পরিচালনা করতে পারেন, যেমন স্ট্যাটিক ফাইলগুলো শুধুমাত্র নির্দিষ্ট ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য রাখা।
উদাহরণ: স্ট্যাটিক ফাইলের কন্ট্রোল
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return '''
<html>
<head>
<link rel="stylesheet" href="/static/css/styles.css">
<script src="/static/js/script.js"></script>
</head>
<body>
<h1>স্বাগতম CherryPy অ্যাপে!</h1>
<img src="/static/images/logo.png" alt="Logo">
</body>
</html>
'''
# কনফিগারেশন
config = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static',
'tools.staticdir.permissions': 'r' # শুধু রিড এক্সেস অনুমোদিত
}
}
if __name__ == '__main__':
cherrypy.quickstart(MyApp(), '/', config)
এখানে:
tools.staticdir.permissions: স্ট্যাটিক ফাইলের জন্য রিড এক্সেস অনুমোদন করা হয়েছে।
৪. স্ট্যাটিক ফাইলের কনটেন্ট টাইপ কনফিগারেশন
CherryPy তে আপনি স্ট্যাটিক ফাইলের কনটেন্ট টাইপ (Content-Type) কনফিগার করতে পারেন, যেমন CSS ফাইলের জন্য text/css এবং JavaScript ফাইলের জন্য application/javascript।
উদাহরণ: কনটেন্ট টাইপ কনফিগারেশন
config = {
'/static/css': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static/css',
'tools.staticdir.content_types': {'css': 'text/css'}
},
'/static/js': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static/js',
'tools.staticdir.content_types': {'js': 'application/javascript'}
}
}
এতে, CherryPy স্ট্যাটিক ফাইলগুলোর সঠিক কনটেন্ট টাইপ সেট করবে এবং ব্রাউজারের জন্য সেগুলো সঠিকভাবে রেন্ডার হবে।
CherryPy তে স্ট্যাটিক ফাইল সংযোগ করা খুবই সহজ এবং নমনীয়। আপনি CSS, JavaScript এবং Images ফাইলগুলো সরাসরি CherryPy সার্ভার দিয়ে পরিবেশন করতে পারেন এবং বিভিন্ন কনফিগারেশন সেট করে তাদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। CherryPy এর tools.staticdir টুল ব্যবহার করে স্ট্যাটিক ফাইলের পাথ এবং কনফিগারেশন সেট করা যায়, যা আপনার ওয়েব অ্যাপ্লিকেশনকে আরও কার্যকরী এবং নিরাপদ করে তোলে।
CherryPy তে File Paths এবং URL Configuration অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি অ্যাপ্লিকেশন পরিচালনা এবং স্ট্যাটিক ফাইল সার্ভিংয়ের জন্য অত্যাবশ্যক। আপনি CherryPy এর সাহায্যে সহজেই স্ট্যাটিক ফাইল (যেমন CSS, JS, ইমেজ) পরিবেশন করতে পারেন এবং URL কনফিগারেশন ব্যবহার করে বিভিন্ন রুট এবং পাথ ম্যানেজ করতে পারেন।
এখানে File Paths এবং URL Configuration কীভাবে কাজ করে তা বিস্তারিত আলোচনা করা হবে।
CherryPy তে File Paths
CherryPy তে File Paths ব্যবস্থাপনা করতে হলে আপনাকে স্ট্যাটিক ফাইল পরিচালনা করার জন্য কিছু টুল ব্যবহার করতে হয়। সাধারণত tools.staticdir ব্যবহার করে আপনি স্ট্যাটিক ফাইল নির্দিষ্ট পাথ থেকে সার্ভ করতে পারেন।
উদাহরণ: স্ট্যাটিক ফাইল সার্ভিং
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপ্লিকেশনে!"
if __name__ == '__main__':
config = {
'/static': {
'tools.staticdir.on': True, # স্ট্যাটিক ফাইল সার্ভিং চালু করা
'tools.staticdir.dir': './static' # স্ট্যাটিক ফাইলের ডিরেক্টরি
}
}
cherrypy.quickstart(MyApp(), '/', config)
ব্যাখ্যা:
tools.staticdir.on: স্ট্যাটিক ফাইল সার্ভিং চালু করে।tools.staticdir.dir: স্ট্যাটিক ফাইলগুলি কোথায় রাখা হয়েছে তা নির্দেশ করে। এখানে./staticডিরেক্টরিতে রাখা ফাইল সার্ভ হবে।
স্ট্যাটিক ফাইল ব্যবস্থাপনা
আপনি CherryPy তে স্ট্যাটিক ফাইল যেমন CSS, JS, ইমেজ বা অন্যান্য ফাইল সার্ভ করতে পারবেন। এর জন্য আপনাকে স্ট্যাটিক ফাইলগুলো নির্দিষ্ট ডিরেক্টরিতে রাখতে হবে এবং tools.staticdir.dir দ্বারা তাদের পাথ নির্ধারণ করতে হবে।
উদাহরণ: স্ট্যাটিক CSS ফাইল
ধরি, আপনার প্রজেক্ট কাঠামো কিছু এরকম:
project/
│
├── app.py
├── static/
│ ├── css/
│ │ └── styles.css
│ └── images/
│ └── logo.png
এখন আপনি styles.css ফাইলটি CherryPy সার্ভার দিয়ে ব্রাউজারে প্রদর্শন করতে পারবেন।
config ফাইলের কনফিগারেশন:
config = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static' # static ডিরেক্টরি থেকে ফাইল সার্ভ
}
}
cherrypy.quickstart(MyApp(), '/', config)
এটি ব্রাউজারে http://127.0.0.1:8080/static/css/styles.css দিয়ে styles.css ফাইলটি অ্যাক্সেস করতে পারবে।
URL Configuration
CherryPy তে URL কনফিগারেশন সহজে সেট করা যায়। আপনি নির্দিষ্ট URI বা রুট পাথের জন্য কাস্টম কনফিগারেশন তৈরি করতে পারেন।
উদাহরণ: Custom Routes
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপ্লিকেশনে!"
@cherrypy.expose
def about(self):
return "এটি অ্যাবাউট পেজ।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
এখানে:
indexরুটটি/এর জন্য কাজ করবে।aboutরুটটি/aboutএর জন্য কাজ করবে।
উদাহরণ: URL প্যারামিটার সহ
আপনি CherryPy তে URL প্যারামিটারও নিতে পারেন।
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপ্লিকেশনে!"
@cherrypy.expose
def user(self, username):
return f"স্বাগতম, {username}!"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
এখানে:
userরুটটি/user/<username>এর জন্য কাজ করবে।- উদাহরণস্বরূপ, http://127.0.0.1:8080/user/JohnDoe এ আপনি "স্বাগতম, JohnDoe!" দেখতে পাবেন।
Custom Routes এবং URL Configuration এর মাধ্যমে Dynamic Routing
CherryPy তে আপনি URL পাথের অংশ হিসেবে ডাইনামিক ডেটা যেমন প্যারামিটার বা ভেরিয়েবল পাস করতে পারেন।
উদাহরণ: Complex URL Routing
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপ্লিকেশনে!"
@cherrypy.expose
def article(self, article_id, category):
return f"এটি {category} ক্যাটাগরির {article_id} আইডির আর্টিকেল।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
এখানে:
articleরুটটি/article/<article_id>/<category>পাথের জন্য কাজ করবে।- উদাহরণস্বরূপ, আপনি http://127.0.0.1:8080/article/123/tech এ গিয়ে "এটি tech ক্যাটাগরির 123 আইডির আর্টিকেল।" দেখতে পারবেন।
Static Files এবং URL Configuration এর কাস্টমাইজেশন
CherryPy তে আপনি স্ট্যাটিক ফাইল সার্ভ করার জন্য আলাদা রুট কনফিগার করতে পারেন, যাতে আপনি ফাইল টাইপ বা পাথ ভেদে বিভিন্ন সেটিংস প্রয়োগ করতে পারেন।
উদাহরণ: স্ট্যাটিক ফাইল সার্ভিং কনফিগারেশন
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "স্বাগতম CherryPy অ্যাপ্লিকেশনে!"
config = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': './static', # স্ট্যাটিক ফাইলের লোকেশন
'tools.staticdir.content_types': {
'css': 'text/css',
'js': 'application/javascript'
} # স্ট্যাটিক ফাইলের কনটেন্ট টাইপ নির্ধারণ
}
}
cherrypy.quickstart(MyApp(), '/', config)
CherryPy তে File Paths এবং URL Configuration ব্যবস্থাপনা সহজ এবং নমনীয়। আপনি স্ট্যাটিক ফাইল সার্ভ করতে পারেন এবং কাস্টম রাউট এবং ডাইনামিক URL কনফিগারেশন ব্যবহার করে অ্যাপ্লিকেশনটিকে আরও শক্তিশালী ও কার্যকরী করতে পারেন। CherryPy এর এই বৈশিষ্ট্যগুলো আপনাকে আরও উন্নত এবং ব্যবহারকারী বান্ধব ওয়েব অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে।
CherryPy তে Media এবং Static Files (যেমন CSS, JavaScript, ইমেজ ফাইল, এবং অন্যান্য স্ট্যাটিক রিসোর্স) সঠিকভাবে পরিচালনা করা এবং সেগুলোর নিরাপত্তা ব্যবস্থা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। বিশেষত যখন অ্যাপ্লিকেশন প্রোডাকশন পরিবেশে চলে আসে, তখন স্ট্যাটিক ফাইলগুলি ওয়েব অ্যাপ্লিকেশনের জন্য একাধিক নিরাপত্তা ঝুঁকি তৈরি করতে পারে। এই ঝুঁকিগুলি যেমন অথোরাইজেশন ও অ্যাক্সেস কন্ট্রোল, অপ্রত্যাশিত স্ক্রিপ্টিং (XSS) এবং ফাইল আক্রমণ (file uploads) অন্তর্ভুক্ত।
CherryPy তে স্ট্যাটিক ফাইলের নিরাপত্তা ব্যবস্থা নিশ্চিত করতে কয়েকটি পদ্ধতি রয়েছে, যা অ্যাপ্লিকেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ।
Static Files এর জন্য নিরাপত্তা ব্যবস্থা
১. স্ট্যাটিক ফাইলের অ্যাক্সেস কন্ট্রোল (Access Control)
স্ট্যাটিক ফাইলের জন্য অ্যাক্সেস কন্ট্রোল সবচেয়ে গুরুত্বপূর্ণ নিরাপত্তা ব্যবস্থা। অনেক সময় কিছু ফাইল বা ডিরেক্টরি নিরাপদ রাখার জন্য অ্যাক্সেস কন্ট্রোল করা প্রয়োজন হতে পারে, যাতে unauthorized বা অবৈধ অ্যাক্সেস না ঘটে।
CherryPy তে এই ধরনের কন্ট্রোল সহজেই করা যায়। আপনি IP রিস্ট্রিকশন বা এনক্রিপ্টেড পাসওয়ার্ড ব্যবহার করতে পারেন, যাতে সুনির্দিষ্ট ক্লায়েন্ট ছাড়া অন্য কেউ স্ট্যাটিক ফাইল অ্যাক্সেস করতে না পারে।
উদাহরণ: স্ট্যাটিক ফাইলের অ্যাক্সেস কন্ট্রোল
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "Hello, this is a secure CherryPy app!"
@cherrypy.expose
def restricted_area(self):
return "This is a restricted area!"
# কনফিগারেশন
conf = {
'/static': {
'tools.staticdir.on': True,
'tools.staticdir.dir': '/path/to/static',
'tools.staticdir.permissions': 'r' # শুধুমাত্র রিড এক্সেস অনুমোদিত
},
'/restricted_area': {
'tools.auth_basic.on': True,
'tools.auth_basic.realm': 'Restricted Area',
'tools.auth_basic.checkpassword': lambda user, pwd: user == "admin" and pwd == "password"
}
}
if __name__ == '__main__':
cherrypy.quickstart(MyApp(), '/', conf)
এখানে, /restricted_area রুটের জন্য Basic Authentication যোগ করা হয়েছে, যা কেবল নির্দিষ্ট ইউজারের জন্য অ্যাক্সেসযোগ্য। এছাড়া /static ডিরেক্টরিতে শুধুমাত্র রিড এক্সেস অনুমোদন করা হয়েছে।
২. ফাইল আপলোড এবং ফাইল টাইপ সুরক্ষা (File Upload and File Type Security)
স্ট্যাটিক ফাইলগুলোর নিরাপত্তা নিশ্চিত করতে ফাইল আপলোড এবং ফাইল টাইপ সুরক্ষা অত্যন্ত গুরুত্বপূর্ণ। আপনি যে ফাইলগুলি অনুমোদিত তা চেক করতে পারেন এবং অপ্রত্যাশিত বা বিপজ্জনক ফাইল টাইপগুলিকে ব্লক করতে পারেন।
উদাহরণ: ফাইল আপলোড নিরাপত্তা
import cherrypy
import os
class FileUploadApp:
@cherrypy.expose
def index(self):
return '''
<form action="upload" method="post" enctype="multipart/form-data">
Select file: <input type="file" name="upload" />
<button type="submit">Upload</button>
</form>
'''
@cherrypy.expose
def upload(self, upload):
# ফাইলের এক্সটেনশন চেক করা হচ্ছে
allowed_extensions = ['jpg', 'jpeg', 'png', 'gif']
filename = upload.filename
ext = filename.split('.')[-1].lower()
if ext not in allowed_extensions:
raise cherrypy.HTTPError(400, "Invalid file type. Allowed types are: jpg, jpeg, png, gif.")
file_path = os.path.join("uploads", filename)
with open(file_path, 'wb') as f:
f.write(upload.file.read())
return f"File uploaded successfully: {filename}"
if __name__ == '__main__':
cherrypy.quickstart(FileUploadApp())
এই উদাহরণে, ফাইল আপলোড মেথডটি শুধুমাত্র jpg, jpeg, png, এবং gif ফাইল টাইপগুলোকে অনুমোদন করে। অন্য ফাইল টাইপগুলো ব্লক হয়ে যাবে।
৩. Cross-Site Scripting (XSS) প্রতিরোধ
স্ট্যাটিক ফাইলগুলির মাধ্যমে Cross-Site Scripting (XSS) আক্রমণ প্রতিরোধের জন্য, আপনি নিশ্চিত করতে হবে যে স্ট্যাটিক ফাইলগুলো সঠিকভাবে স্যানিটাইজ করা হচ্ছে। আপনি Content Security Policy (CSP) ব্যবহার করে স্ক্রিপ্ট বা কোড ইনজেকশন থেকে নিরাপদ থাকতে পারেন।
উদাহরণ: CSP (Content Security Policy) কনফিগারেশন
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "This is a secure page with CSP protection."
@cherrypy.expose
def about(self):
return "This is an About page with CSP protection."
if __name__ == '__main__':
cherrypy.config.update({
'tools.csp.on': True, # CSP চালু করা
'tools.csp.policy': "default-src 'self'; script-src 'self'; object-src 'none';" # নিরাপদ CSP পলিসি
})
cherrypy.quickstart(MyApp())
এখানে, Content Security Policy চালু করা হয়েছে, যাতে শুধুমাত্র নির্দিষ্ট সোর্স থেকে স্ক্রিপ্ট ও অন্যান্য কন্টেন্ট লোড করা হয়। এটি XSS আক্রমণ প্রতিরোধে সহায়তা করে।
৪. অ্যাচেভমেন্ট প্রোটেকশন (Cache-Control)
স্ট্যাটিক ফাইলের নিরাপত্তা নিশ্চিত করতে Cache-Control হেডার ব্যবহার করা উচিত, বিশেষ করে এমন ফাইলগুলির জন্য যেগুলোর কন্টেন্ট নিয়মিত পরিবর্তিত হয়।
উদাহরণ: Cache-Control সেটিংস
import cherrypy
class MyApp:
@cherrypy.expose
def index(self):
return "Secure static file caching."
if __name__ == '__main__':
cherrypy.config.update({
'tools.staticdir.on': True,
'tools.staticdir.dir': './static',
'tools.staticdir.cache_control': 'private, no-store, must-revalidate'
})
cherrypy.quickstart(MyApp())
এখানে, Cache-Control হেডার দিয়ে সেট করা হয়েছে, যাতে স্ট্যাটিক ফাইলগুলি ক্যাশে না থাকে এবং নিরাপদভাবে পুনরায় লোড হয়।
CherryPy তে Media এবং Static Files এর নিরাপত্তা ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ। সঠিকভাবে অ্যাক্সেস কন্ট্রোল, ফাইল আপলোড নিরাপত্তা, XSS প্রতিরোধ, এবং ক্যাশ কন্ট্রোল ইত্যাদি ব্যবস্থা গ্রহণ করে আপনি আপনার ওয়েব অ্যাপ্লিকেশনকে নিরাপদ রাখতে পারেন। CherryPy এর কনফিগারেশন টুলস এবং নিরাপত্তা ফিচার ব্যবহার করে আপনি স্ট্যাটিক ফাইলের অ্যাক্সেস কন্ট্রোল এবং সিকিউরিটি নিশ্চিত করতে পারবেন।
Read more