Flask-এর Form Handling এবং Validation ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ যখন আপনি ব্যবহারকারীর ইনপুট গ্রহণ এবং সঠিকতা যাচাই করতে চান। Flask নিজে কোনো বিল্ট-ইন ফর্ম হ্যান্ডলিং এবং ভ্যালিডেশন সিস্টেম সরবরাহ করে না, তবে Flask-WTF নামক একটি এক্সটেনশন ব্যবহার করে এটি সহজেই করা যায়। Flask-WTF হল WTForms লাইব্রেরির উপরের একটি ওয়্যারাপার, যা ফর্মের জন্য ইনপুট ভ্যালিডেশন, সিকিউরিটি ফিচার, এবং সহজ ফর্ম তৈরি করার সুবিধা প্রদান করে।
১. Flask-WTF ইনস্টলেশন
ফ্লাস্কের ফর্ম হ্যান্ডলিং এবং ভ্যালিডেশন ব্যবস্থাপনা শুরু করতে প্রথমে Flask-WTF ইনস্টল করতে হবে।
pip install flask-wtf
২. Flask-WTF এর মাধ্যমে Form Handling
ধাপ ১: Flask অ্যাপ্লিকেশন তৈরি করা
এটি ফর্ম তৈরি এবং ফর্ম হ্যান্ডলিংয়ের জন্য মৌলিক Flask অ্যাপ্লিকেশন।
from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'আপনার-গোপন-কী' # সিকিউরিটি ফিচারের জন্য গোপন কী
# ফর্ম ক্লাস তৈরি
class NameForm(FlaskForm):
name = StringField('আপনার নাম', validators=[DataRequired()])
submit = SubmitField('জমা দিন')
# রাউট সেটআপ
@app.route("/", methods=["GET", "POST"])
def home():
form = NameForm()
if form.validate_on_submit():
flash(f"স্বাগতম {form.name.data}!", 'success')
return redirect(url_for('home'))
return render_template('index.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
এখানে:
FlaskForm: Flask-WTF এর মাধ্যমে ফর্ম ক্লাস তৈরি করা হয়।StringField: একটি টেক্সট ইনপুট ফিল্ড।validators=[DataRequired()]: এটি নিশ্চিত করে যে ফিল্ডটি খালি না থাকে (ফর্ম ভ্যালিডেশনের জন্য)।SubmitField: সাবমিট বাটন তৈরি করা হয়।
ধাপ ২: HTML টেমপ্লেট তৈরি করা
templates/index.html নামের একটি ফাইল তৈরি করুন এবং নিচের কোড দিন:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask ফর্ম হ্যান্ডলিং</title>
</head>
<body>
<h1>ফর্ম ভর্তি করুন</h1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.name.label }} <br>
{{ form.name(size=32) }}
</div>
<div>
{{ form.submit() }}
</div>
</form>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<ul>
{% for category, message in messages %}
<li class="{{ category }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>
এখানে:
{{ form.hidden_tag() }}: CSRF সুরক্ষার জন্য প্রয়োজনীয় একটি ট্যাগ।{{ form.name(size=32) }}: নাম ইনপুট ফিল্ড।{{ form.submit() }}: সাবমিট বাটন।
এখন, আপনি ব্রাউজারে http://127.0.0.1:5000/ URL এ গিয়ে ফর্মটি দেখতে পাবেন। যদি আপনি ফর্ম জমা দেন, তবে ইনপুটের নামটি সঠিকভাবে প্রক্রিয়া হবে এবং "স্বাগতম [নাম]" বার্তা প্রদর্শিত হবে।
৩. Flask-WTF এর মাধ্যমে ফর্ম ভ্যালিডেশন
Flask-WTF ব্যবহার করে ফর্মের ভ্যালিডেশন করা সহজ। এখানে কিছু সাধারণ ভ্যালিডেশন অপশন রয়েছে:
সাধারণ ভ্যালিডেশন উদাহরণ:
DataRequired: একটি ফিল্ড খালি থাকতে পারবে না।name = StringField('আপনার নাম', validators=[DataRequired()])Length: ইনপুটের দৈর্ঘ্য নির্ধারণ করা।name = StringField('আপনার নাম', validators=[Length(min=3, max=20)])Email: ইমেইল ফিল্ড ভ্যালিডেশন।email = StringField('ইমেইল', validators=[Email()])EqualTo: দুটি ফিল্ডের মান একে অপরের সমান হতে হবে।password = PasswordField('পাসওয়ার্ড', validators=[DataRequired()]) confirm_password = PasswordField('পাসওয়ার্ড নিশ্চিত করুন', validators=[DataRequired(), EqualTo('password')])
৪. Flask-WTF এর মাধ্যমে Custom Validation
আপনি কাস্টম ভ্যালিডেশনও তৈরি করতে পারেন। এই ক্ষেত্রে, আপনি একটি কাস্টম ভ্যালিডেশন মেথড তৈরি করবেন যা ফর্মের ভ্যালিডেশন প্রক্রিয়ায় প্রয়োগ করা হবে।
উদাহরণ:
from wtforms.validators import ValidationError
class NameForm(FlaskForm):
name = StringField('আপনার নাম', validators=[DataRequired()])
submit = SubmitField('জমা দিন')
def validate_name(self, field):
if field.data == 'admin':
raise ValidationError('এই নামটি গ্রহণযোগ্য নয়')
এখানে, যদি ব্যবহারকারী "admin" নাম লিখে ফর্ম জমা দেয়, তাহলে একটি ValidationError বার্তা দেখাবে।
৫. Flask-WTF এর মাধ্যমে CSRF সুরক্ষা
Flask-WTF নিজে CSRF (Cross-Site Request Forgery) সুরক্ষা প্রদান করে। যখন আপনি একটি ফর্ম তৈরি করেন, Flask-WTF স্বয়ংক্রিয়ভাবে একটি hidden CSRF টোকেন যুক্ত করে।
এটি সঠিকভাবে কাজ করার জন্য Flask অ্যাপে সিকিউরিটি সেটিংস করতে হয়:
app.config['SECRET_KEY'] = 'আপনার-গোপন-কী' # এইটি গুরুত্বপূর্ণ CSRF সুরক্ষার জন্য
Flask-এর Form Handling এবং Validation ব্যবস্থাপনা করার জন্য Flask-WTF একটি শক্তিশালী টুল। এটি আপনাকে সহজেই ফর্ম তৈরি, ইনপুট ভ্যালিডেশন, এবং নিরাপত্তা ফিচার যেমন CSRF সুরক্ষা সরবরাহ করতে সাহায্য করে। Flask-WTF এবং WTForms এর মাধ্যমে আপনি ব্যবহারকারীর ইনপুট চেক করতে পারেন এবং ডাইনামিকভাবে ভ্যালিডেশন মেথড তৈরি করতে পারেন।
Flask অ্যাপ্লিকেশনে HTML Form Data প্রোসেস করার জন্য সাধারণত GET এবং POST HTTP মেথড ব্যবহার করা হয়। ফর্মের মাধ্যমে ব্যবহারকারী ইনপুট প্রদান করে এবং Flask সেটি গ্রহণ করে প্রক্রিয়া করে। আপনি ফর্ম ডেটা প্রোসেস করতে Flask এর request অবজেক্ট ব্যবহার করতে পারেন।
এখানে দেখানো হবে কিভাবে HTML ফর্ম তৈরি করা যায় এবং ফর্ম ডেটা Flask অ্যাপ্লিকেশনে প্রোসেস করা যায়।
১. HTML Form তৈরি করা
প্রথমে একটি HTML ফর্ম তৈরি করা হবে, যেখানে ব্যবহারকারী কিছু ডেটা ইনপুট করতে পারবেন।
উদাহরণ: form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask Form</title>
</head>
<body>
<h1>ফর্মে ডেটা ইনপুট করুন</h1>
<form action="/submit" method="POST">
<label for="name">নাম:</label>
<input type="text" id="name" name="name"><br><br>
<label for="email">ইমেইল:</label>
<input type="email" id="email" name="email"><br><br>
<input type="submit" value="সাবমিট">
</form>
</body>
</html>
এখানে:
action="/submit": ফর্মটি সাবমিট করার পর/submitরাউটে যাবে।method="POST": ফর্মটি POST মেথডে সাবমিট হবে।
২. Flask অ্যাপ্লিকেশন তৈরি করা
এখন Flask অ্যাপ তৈরি করবো যেখানে ফর্ম ডেটা প্রোসেস করা হবে।
উদাহরণ: app.py
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('form.html') # HTML ফর্মের পেজ দেখাবে
@app.route('/submit', methods=['POST'])
def submit():
if request.method == 'POST':
# ফর্ম ডেটা গ্রহণ করা
name = request.form['name']
email = request.form['email']
# ডেটা প্রিন্ট করা (আপনি ডেটা প্রোসেস বা ডাটাবেসে সেভ করতে পারেন)
return f"নাম: {name}, ইমেইল: {email}"
if __name__ == '__main__':
app.run(debug=True)
এখানে:
@app.route('/'): এটি হোম পেজের রাউট, যেখানে ফর্মটি উপস্থিত থাকবে।@app.route('/submit', methods=['POST']): এটি ফর্ম সাবমিট হওয়ার পর/submitরাউটটি হ্যান্ডেল করবে। এখানে POST মেথড ব্যবহার করা হয়েছে।request.form['name']:request.formব্যবহার করে ফর্ম ডেটা অ্যাক্সেস করা হয়।
৩. ফর্ম সাবমিট করা এবং ডেটা প্রদর্শন করা
এখন, ফর্মটি ব্যবহারকারী জমা দিলে /submit রাউটটি ডেটা গ্রহণ করে এবং সেই ডেটা প্রদর্শন করবে।
উদাহরণ:
যখন আপনি হোম পেজে গিয়ে ফর্ম পূর্ণ করে সাবমিট করবেন, তখন নাম এবং ইমেইল ডেটা প্রিন্ট হবে:
নাম: জন, ইমেইল: john@example.com
৪. HTML ফর্মে Validation (ভ্যালিডেশন)
HTML ফর্মের ইনপুট ভ্যালিডেশন খুবই গুরুত্বপূর্ণ। Flask-এ আপনি ফর্ম ইনপুট যাচাই করতে পারেন। উদাহরণস্বরূপ, ইনপুট না দিলে একটি ত্রুটি বার্তা প্রদর্শন করা যায়।
উদাহরণ: ফর্ম ভ্যালিডেশন
@app.route('/submit', methods=['POST'])
def submit():
if request.method == 'POST':
# ফর্ম ডেটা গ্রহণ
name = request.form['name']
email = request.form['email']
# ইনপুট ভ্যালিডেশন
if not name or not email:
return "নাম বা ইমেইল ফিল্ড ফাঁকা রাখা যাবে না!", 400 # 400 Bad Request
return f"নাম: {name}, ইমেইল: {email}"
এখানে:
if not name or not email:: যদি ইনপুট ফিল্ডে কিছু না দেওয়া থাকে, তবে একটি ত্রুটি বার্তা প্রদর্শিত হবে।
৫. Flask WTForms ব্যবহার করা
Flask অ্যাপ্লিকেশনে ফর্ম ব্যবস্থাপনার জন্য Flask-WTF লাইব্রেরি ব্যবহার করা যেতে পারে, যা ফর্ম ভ্যালিডেশন এবং সুরক্ষা ফিচার সরবরাহ করে।
Flask-WTF সেটআপ:
Flask-WTF ইনস্টল করুন:
pip install flask-wtf- ফর্ম তৈরি করুন:
from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, EmailField
from wtforms.validators import DataRequired, Email
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
class ContactForm(FlaskForm):
name = StringField('নাম', validators=[DataRequired()])
email = EmailField('ইমেইল', validators=[DataRequired(), Email()])
@app.route('/', methods=['GET', 'POST'])
def home():
form = ContactForm()
if form.validate_on_submit():
name = form.name.data
email = form.email.data
return f"নাম: {name}, ইমেইল: {email}"
return render_template('form.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
form.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WTForms Example</title>
</head>
<body>
<h1>ফর্মে ডেটা ইনপুট করুন</h1>
<form method="POST">
{{ form.hidden_tag() }}
<label for="name">নাম:</label>
{{ form.name(size=20) }}<br><br>
<label for="email">ইমেইল:</label>
{{ form.email(size=20) }}<br><br>
<input type="submit" value="সাবমিট">
</form>
</body>
</html>
এখানে:
- FlaskForm এবং WTForms ব্যবহার করা হয়েছে ফর্মের ইনপুট ভ্যালিডেশন ও নিরাপত্তা নিশ্চিত করতে।
Flask-এ HTML Form Data প্রোসেস করা একটি সহজ প্রক্রিয়া, এবং request.form ব্যবহার করে ফর্ম ডেটা সহজে এক্সেস করা যায়। ফর্ম ইনপুট ভ্যালিডেশন এবং নিরাপত্তা নিশ্চিত করার জন্য Flask-WTF ব্যবহার করা যেতে পারে, যা আরও শক্তিশালী এবং নিরাপদ ফর্ম প্রোসেসিং সরবরাহ করে। Flask অ্যাপ্লিকেশনকে ডাইনামিক এবং ইউজার-ইন্টারঅ্যাকটিভ তৈরি করতে ফর্ম ডেটা প্রোসেসিং অপরিহার্য।
Flask-WTF হলো Flask-এ ফর্ম তৈরি এবং ভ্যালিডেট করার জন্য একটি শক্তিশালী এক্সটেনশন। এটি Flask অ্যাপ্লিকেশনে WTForms লাইব্রেরির একটি সহজ ইন্টারফেস সরবরাহ করে, যা ফর্ম হ্যান্ডলিং, ভ্যালিডেশন এবং CSRF (Cross-Site Request Forgery) সুরক্ষা প্রদান করে।
Flask-WTF ব্যবহার করে আপনি খুব সহজেই ফর্ম তৈরি, ডেটা গ্রহণ এবং ভ্যালিডেট করতে পারবেন। এতে ডাইনামিক ফর্ম এবং ইউজার ইনপুট ভ্যালিডেশনের কাজ আরও সহজ হয়ে ওঠে।
Flask-WTF ইনস্টলেশন
প্রথমেই Flask-WTF ইনস্টল করতে হবে:
pip install flask-wtf
Flask-WTF এর সাথে ফর্ম তৈরি এবং ভ্যালিডেট করা
ধাপ ১: Flask অ্যাপ তৈরি
from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
# ফর্ম ক্লাস
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=4, max=20)])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
@app.route("/", methods=["GET", "POST"])
def home():
form = LoginForm()
if form.validate_on_submit(): # ফর্মটি সাবমিট হলে ভ্যালিডেশন চালানো হবে
username = form.username.data
password = form.password.data
# এখানে ডাটাবেস চেক বা সেশন স্টোরেজ যুক্ত করা যেতে পারে
return redirect(url_for('welcome', username=username)) # সফল লগিন হলে রিডাইরেক্ট
return render_template('login.html', form=form)
@app.route("/welcome/<username>")
def welcome(username):
return f"স্বাগতম, {username}!"
if __name__ == "__main__":
app.run(debug=True)
এখানে:
LoginForm: এটি Flask-WTF এর একটি ফর্ম ক্লাস যাusername,password, এবংsubmitফিল্ডের সাথে তৈরি করা হয়েছে।validate_on_submit(): এটি ফর্মের ডেটা ভ্যালিডেশন করে এবং যদি সমস্ত ইনপুট ভ্যালিড থাকে, তখন তা প্রসেস করা হয়।redirect(url_for(...)): ফর্ম সফলভাবে সাবমিট হলে ইউজারকে অন্য একটি পেজে রিডাইরেক্ট করা হয়।
ধাপ ২: HTML টেমপ্লেট তৈরি
Flask-WTF ফর্ম রেন্ডার করতে Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করা হয়। এখন login.html নামে একটি HTML টেমপ্লেট তৈরি করি।
<!-- templates/login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login Form</title>
</head>
<body>
<h2>Login Form</h2>
<form method="POST" action="/">
{{ form.hidden_tag() }} <!-- CSRF Protection -->
<div>
<label for="username">Username:</label>
{{ form.username(class="form-control") }}
{% for error in form.username.errors %}
<p style="color: red;">{{ error }}</p>
{% endfor %}
</div>
<div>
<label for="password">Password:</label>
{{ form.password(class="form-control") }}
{% for error in form.password.errors %}
<p style="color: red;">{{ error }}</p>
{% endfor %}
</div>
<div>
{{ form.submit(class="btn btn-primary") }}
</div>
</form>
</body>
</html>
এখানে:
form.hidden_tag(): এটি CSRF সুরক্ষা হ্যান্ডল করে, যা Flask-WTF দ্বারা স্বয়ংক্রিয়ভাবে যোগ করা হয়।{{ form.username(...) }}: এটি Flask-WTF ফর্ম ফিল্ডগুলি রেন্ডার করতে ব্যবহার করা হয়।{% for error in form.username.errors %}: এটি ফর্ম ফিল্ডের জন্য কোনো ত্রুটি থাকলে তা দেখাবে।
Flask-WTF Validation
Flask-WTF ফর্মে সাধারণত কিছু সাধারণ ভ্যালিডেশন ব্যবহার করা হয়, যেমন:
DataRequired: ইনপুট ফিল্ডটি ফাঁকা থাকতে পারবে না।Length(min=4, max=20): ইনপুটের দৈর্ঘ্য একটি নির্দিষ্ট পরিসরে থাকতে হবে।EqualTo('password'): দুটি ফিল্ডের মান একে অপরের সমান হতে হবে (যেমন পাসওয়ার্ড কনফার্মেশন)।
উদাহরণ:
from wtforms.validators import DataRequired, Length, EqualTo
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=4, max=20)])
password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Register')
সাধারণ Validation Error Handling
ফ্লাস্ক ফর্মের মধ্যে ট্রান্সলেটেবল ত্রুটি বার্তা দেখানো সম্ভব। উদাহরণস্বরূপ, যদি ইউজার নামের জন্য Length(min=4) ত্রুটি ঘটে, তবে এর বার্তা এমন হবে:
{% for error in form.username.errors %}
<p style="color: red;">{{ error }}</p>
{% endfor %}
এটি ত্রুটির বার্তা দেখাবে, যেমন "Username must be at least 4 characters."
Flask-WTF এর অন্যান্য বৈশিষ্ট্য
- CSRF Protection: Flask-WTF CSRF সুরক্ষা প্রদান করে, যা আপনার ফর্মগুলিকে নিরাপদ রাখে।
- File Uploads: ফাইল আপলোডের জন্য সহজ ইন্টারফেস।
- Custom Validators: আপনি নিজের কাস্টম ভ্যালিডেটর তৈরি করতে পারেন।
- Form Rendering: Flask-WTF ফর্ম রেন্ডারিং সরল করে এবং HTML ফর্মের সাথে Flask ফর্মগুলি একত্রিত করতে সহজ করে তোলে।
Flask-WTF দিয়ে ফর্ম তৈরি এবং ভ্যালিডেট করা খুবই সহজ এবং শক্তিশালী। Flask-WTF ফর্ম প্রক্রিয়াগুলি সংক্ষেপ করে, ফর্ম ডেটা ভ্যালিডেশন, সুরক্ষা এবং কাস্টমাইজেশন সহজ করে তোলে। এটি আপনার অ্যাপ্লিকেশনে ফর্ম হ্যান্ডলিংকে একটি পরিষ্কার এবং নিরাপদ পদ্ধতিতে কার্যকর করার জন্য একটি অত্যন্ত কার্যকর উপায়।
Flask একটি মাইক্রোফ্রেমওয়ার্ক হিসেবে পরিচিত, কিন্তু এটি নিরাপত্তার জন্য শক্তিশালী বৈশিষ্ট্য সমর্থন করে। Flask-এর মধ্যে CSRF (Cross-Site Request Forgery) প্রতিরোধ এবং Security Management করার জন্য বিভিন্ন টুল এবং পদ্ধতি রয়েছে। নিরাপদ ওয়েব অ্যাপ্লিকেশন তৈরি করতে CSRF এর মতো আক্রমণ থেকে রক্ষা করা অত্যন্ত গুরুত্বপূর্ণ।
১. CSRF Protection কী?
CSRF (Cross-Site Request Forgery) একটি ধরনের আক্রমণ যা ব্যবহারকারীকে অব্যাহতভাবে অজান্তে ক্ষতিকর কার্যক্রমে বাধ্য করে, যেমন একাউন্টে লগইন থাকা অবস্থায়, কোনো অনুকূল অ্যাকশন করা (যেমন ফান্ড ট্রান্সফার)। এটি ব্যবহারকারীর অনুপস্থিতিতে সাইড-ইফেক্ট সৃষ্টি করতে পারে।
২. Flask-এ CSRF Protection
Flask-এ CSRF প্রতিরোধের জন্য জনপ্রিয় এক্সটেনশন হলো Flask-WTF, যা ফ্লাস্কের জন্য ফর্ম হ্যান্ডলিং সহ নিরাপত্তার জন্য CSRF প্রতিরোধ কভার করে।
Flask-WTF ইনস্টলেশন:
pip install flask-wtf
CSRF Protection সক্রিয় করা:
Flask-WTF এক্সটেনশনের মাধ্যমে CSRF প্রতিরোধ সক্রিয় করা যায়। প্রথমে Flask-WTF এক্সটেনশন ব্যবহার করে ফর্মে CSRF নিরাপত্তা যুক্ত করতে হবে।
উদাহরণ:
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
# CSRF Protection সক্রিয় করতে সিক্রেট কী প্রয়োজন
app.config['SECRET_KEY'] = 'একটি-গোপন-কী'
# CSRF Protection সক্রিয় করার জন্য Flask-WTF এর CSRFProtect ব্যবহার করা
csrf = CSRFProtect(app)
class MyForm(FlaskForm):
name = StringField('নাম')
submit = SubmitField('সাবমিট')
@app.route("/", methods=["GET", "POST"])
def home():
form = MyForm()
if form.validate_on_submit():
return f"আপনার নাম: {form.name.data}"
return render_template('form.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
এখানে:
csrf = CSRFProtect(app): এটি CSRF Protection সক্রিয় করার জন্য ব্যবহৃত হয়।SECRET_KEY: Flask অ্যাপ্লিকেশনের জন্য একটি সিক্রেট কী থাকতে হবে যা CSRF Protection সক্ষম করবে।
HTML ফর্মের মধ্যে CSRF Token যোগ করা:
Flask-WTF স্বয়ংক্রিয়ভাবে CSRF token ফর্মের মধ্যে যোগ করে, কিন্তু আপনি যদি নিজে যুক্ত করতে চান, তাহলে নিচের মতো করতে হবে:
<form method="POST">
{{ form.hidden_tag() }} <!-- CSRF token এখানে যুক্ত হচ্ছে -->
{{ form.name.label }} {{ form.name }}
{{ form.submit }}
</form>
form.hidden_tag() CSRF token অন্তর্ভুক্ত করার জন্য ব্যবহার করা হয়।
৩. Flask Security Management
Flask-এ নিরাপত্তা ব্যবস্থাপনা করার জন্য বেশ কিছু কার্যকরী টুল এবং পদ্ধতি রয়েছে। এর মধ্যে সিক্রেট কী ব্যবহার, ফর্ম অথেন্টিকেশন, কুকি নিরাপত্তা এবং বিভিন্ন টোকেন সিস্টেম অন্তর্ভুক্ত রয়েছে।
৩.১ Flask-Login
Flask-Login একটি জনপ্রিয় এক্সটেনশন যা ব্যবহারকারী অথেন্টিকেশন এবং সেশন ম্যানেজমেন্ট সহজ করে। এর মাধ্যমে ব্যবহারকারীদের লগইন, লগআউট এবং সেশন পরিচালনা করা সম্ভব।
ইনস্টলেশন:
pip install flask-login
Flask-Login ব্যবহার:
from flask import Flask, render_template, redirect, url_for, request
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.config['SECRET_KEY'] = 'সিক্রেট-কী'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user = User(id=1) # উদাহরণস্বরূপ ব্যবহারকারী সিস্টেমে লগইন হচ্ছে
login_user(user)
return redirect(url_for('protected'))
return render_template('login.html')
@app.route('/protected')
@login_required
def protected():
return f"স্বাগতম, {current_user.id}!"
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == "__main__":
app.run(debug=True)
এখানে:
@login_required: এই ডেকোরেটরটি সেই রাউটের জন্য প্রয়োজনীয়, যা শুধুমাত্র লগইন করা ব্যবহারকারী অ্যাক্সেস করতে পারবে।login_user(): ব্যবহারকারীকে লগইন করার জন্য ব্যবহৃত হয়।logout_user(): ব্যবহারকারীকে লগআউট করার জন্য ব্যবহৃত হয়।
৩.২ Flask-Security
Flask-Security আরো উন্নত নিরাপত্তা ব্যবস্থাপনা প্রদান করে, যেমন ব্যবহারকারী অথেন্টিকেশন, অথোরাইজেশন, ফর্ম অথেন্টিকেশন এবং বিভিন্ন নিরাপত্তা ফিচার।
ইনস্টলেশন:
pip install flask-security
৪. Cookie এবং Session Security
Flask-এ Session এবং Cookie নিরাপত্তার জন্য আপনি কিছু কনফিগারেশন সেট করতে পারেন। Flask সাধারণত সেশন ম্যানেজমেন্টের জন্য secure cookie ব্যবহার করে, যা নিরাপদভাবে ডেটা স্টোর করতে সাহায্য করে।
উদাহরণ:
app.config['SESSION_COOKIE_HTTPONLY'] = True # JavaScript থেকে সেশন অ্যাক্সেস বন্ধ করবে
app.config['SESSION_COOKIE_SECURE'] = True # HTTPS চাইল্ডেড ডোমেইন ব্যবহারের জন্য
app.config['SESSION_PERMANENT'] = False
এখানে:
SESSION_COOKIE_HTTPONLY: এটি JavaScript দ্বারা কুকি অ্যাক্সেস নিষিদ্ধ করে।SESSION_COOKIE_SECURE: এটি শুধুমাত্র HTTPS কানেকশন ব্যবহার করে কুকি পাঠাবে।SESSION_PERMANENT: এই সেটিংটি সেশনটি স্থায়ী বা অস্থায়ী হবে তা নির্ধারণ করে।
৫. XSS (Cross-Site Scripting) প্রতিরোধ
Flask-এ XSS (Cross-Site Scripting) প্রতিরোধের জন্য আপনার ফর্ম ডেটা এবং ইনপুটের সঠিক যাচাই করা অত্যন্ত গুরুত্বপূর্ণ। HTML টেমপ্লেটগুলি Jinja2 ব্যবহার করে ডেটাকে স্বয়ংক্রিয়ভাবে escape করে, যাতে ইনপুটের মধ্যে HTML বা JavaScript কোড চলে না আসে।
উদাহরণ:
@app.route("/comment", methods=["POST"])
def comment():
comment_text = request.form['comment']
return render_template('comment.html', comment=comment_text)
এখানে, Jinja2 ইনপুট ডেটা থেকে যেকোনো HTML বা JavaScript ট্যাগগুলো স্বয়ংক্রিয়ভাবে escape করবে।
Flask-এ CSRF Protection এবং Security Management ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ, এবং Flask আপনাকে বিভিন্ন এক্সটেনশন ও কনফিগারেশনের মাধ্যমে এই নিরাপত্তা ব্যবস্থা তৈরি করতে সহায়তা করে। Flask-WTF এর মাধ্যমে CSRF প্রতিরোধ, Flask-Login ব্যবহার করে অথেন্টিকেশন এবং সেশন ম্যানেজমেন্ট, এবং অন্যান্য নিরাপত্তা ফিচারের মাধ্যমে আপনার অ্যাপ্লিকেশনকে নিরাপদে রাখা সম্ভব।
Flask-এ Custom Form Validation Rules তৈরি করা খুবই সহজ এবং এটি ব্যবহারকারীর ইনপুট যাচাই (validation) করার জন্য একটি গুরুত্বপূর্ণ ফিচার। Flask-WTF (Flask এর জন্য একটি ফর্ম এবং উইজেট লাইব্রেরি) ব্যবহার করে ফর্ম ভ্যালিডেশন করা যায় এবং আপনি কাস্টম ভ্যালিডেশন লজিক যোগ করতে পারেন। Flask-WTF ব্যবহার করে আপনি সহজেই ফর্মের ইনপুট যাচাই করতে পারবেন, এবং কখনও কখনও কাস্টম ভ্যালিডেশন রুলস তৈরি করার প্রয়োজন পড়ে।
Flask-WTF
Flask-WTF একটি ফর্ম হ্যান্ডলিং লাইব্রেরি যা WTForms এর উপর ভিত্তি করে তৈরি। এটি Flask অ্যাপ্লিকেশনে ফর্ম তৈরি এবং প্রক্রিয়া করার জন্য একটি সহজ এবং কার্যকর পদ্ধতি প্রদান করে।
Flask-WTF ইনস্টলেশন
প্রথমে Flask-WTF ইনস্টল করতে হবে:
pip install flask-wtf
কাস্টম ভ্যালিডেশন রুলস তৈরি করা
Flask-WTF ব্যবহার করে কাস্টম ফর্ম ভ্যালিডেশন রুল তৈরি করতে আপনি validators ব্যবহার করবেন। এখানে validate_<fieldname> নামে একটি মেথড তৈরি করে কাস্টম ভ্যালিডেশন রুল তৈরি করা হয়।
উদাহরণ: Custom Form Validation in Flask
- Flask অ্যাপ্লিকেশন সেটআপ করা
from flask import Flask, render_template, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Length, ValidationError
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
# Custom validator function
def validate_username(form, field):
if field.data == "admin":
raise ValidationError("Username 'admin' is not allowed.")
class UserForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=4, max=25), validate_username])
submit = SubmitField('Submit')
@app.route("/", methods=["GET", "POST"])
def home():
form = UserForm()
if form.validate_on_submit():
return redirect(url_for('success'))
return render_template('index.html', form=form)
@app.route("/success")
def success():
return "Form submitted successfully!"
if __name__ == "__main__":
app.run(debug=True)
ব্যাখ্যা:
UserFormক্লাসে কাস্টম ভ্যালিডেশন:- এখানে,
validate_usernameমেথডটি কাস্টম ভ্যালিডেশন রুল হিসেবে তৈরি করা হয়েছে। এটি ইনপুটের সাথে যাচাই করে যে, "admin" ব্যবহারকারীর নাম গ্রহণযোগ্য নয়। যদি ইনপুটে "admin" থাকে, তবে এটি একটি ত্রুটি (error) দেখাবে।
- এখানে,
validators=[DataRequired(), Length(min=4, max=25), validate_username]:DataRequired(): এটি নিশ্চিত করে যে ফিল্ডটি খালি থাকবে না।Length(min=4, max=25): এটি ফিল্ডের জন্য মিনিমাম এবং ম্যাক্সিমাম দৈর্ঘ্য নির্ধারণ করে।validate_username: এটি কাস্টম ভ্যালিডেশন ফাংশন যা আগে ব্যাখ্যা করা হয়েছে।
validate_on_submit():- এই মেথডটি ফর্মটি সাবমিট হলে, ফর্মের সমস্ত ভ্যালিডেশন পরীক্ষা করে। যদি সব ভ্যালিডেশন পাস হয়, তবে এটি
Trueরিটার্ন করবে এবং আমরা সফল পৃষ্ঠাতে রিডাইরেক্ট করব।
- এই মেথডটি ফর্মটি সাবমিট হলে, ফর্মের সমস্ত ভ্যালিডেশন পরীক্ষা করে। যদি সব ভ্যালিডেশন পাস হয়, তবে এটি
২. কাস্টম ভ্যালিডেশন রুলের জন্য error message কাস্টমাইজেশন
Flask-WTF এ আপনি কাস্টম ভ্যালিডেশন রুল তৈরি করার পাশাপাশি, কাস্টম ত্রুটি বার্তা (error message) সরবরাহ করতে পারেন।
উদাহরণ:
def validate_username(form, field):
if field.data == "admin":
raise ValidationError("Username 'admin' is not allowed. Please choose a different username.")
এখানে:
ValidationError: এই ক্লাসটি ত্রুটি বার্তা ফেলে দেয় যখন কাস্টম ভ্যালিডেশন ব্যর্থ হয়। আপনি আপনার বার্তা কাস্টমাইজ করতে পারেন যেমন "Username 'admin' is not allowed. Please choose a different username."
৩. ফর্ম রেন্ডারিং এবং ত্রুটি বার্তা দেখানো
index.html ফাইলটি তৈরি করুন এবং ফর্মের ত্রুটি বার্তা দেখানোর জন্য এই কোড ব্যবহার করুন:
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask Form</title>
</head>
<body>
<h1>Submit a username</h1>
<form method="POST">
{{ form.hidden_tag() }}
<div>
<label for="username">Username:</label>
{{ form.username(size=32) }}
{% if form.username.errors %}
<ul>
{% for error in form.username.errors %}
<li style="color: red;">{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</div>
<div>
{{ form.submit() }}
</div>
</form>
</body>
</html>
এখানে:
{{ form.username.errors }}: এটি ফর্মের ত্রুটিগুলি দেখানোর জন্য ব্যবহৃত হয়। যদি কোনও ত্রুটি থাকে, তবে তা লাল রঙে প্রদর্শিত হবে।
৪. ভিন্ন ধরনের কাস্টম ভ্যালিডেশন রুলস
আপনি আরও বিভিন্ন ধরনের কাস্টম ভ্যালিডেশন রুল তৈরি করতে পারেন, যেমন:
- ইমেইল যাচাই: নিশ্চিত করুন যে ফিল্ডে একটি বৈধ ইমেইল ঠিকানা রয়েছে।
- অন্যান্য কাস্টম রুলস: যেমন, একটি ফিল্ডের মান অন্য ফিল্ডের মানের সঙ্গে মেলানো, অথবা কিছু নির্দিষ্ট শর্তের উপর ভিত্তি করে ভ্যালিডেশন।
উদাহরণ: কাস্টম ইমেইল ভ্যালিডেশন
from wtforms.validators import Email
def validate_email(form, field):
if not field.data.endswith('@example.com'):
raise ValidationError("Email must be from 'example.com' domain.")
এটি ইমেইল ভ্যালিডেশন করবে এবং কেবলমাত্র "example.com" ডোমেইন থেকে ইমেইল গ্রহণ করবে।
Flask-WTF এবং Custom Form Validation ব্যবহারের মাধ্যমে আপনি আপনার ফর্ম ইনপুট যাচাই করতে পারবেন এবং কাস্টম রুল তৈরি করতে পারবেন। এটি ব্যবহারকারীর ইনপুট সঠিকভাবে যাচাই করতে সাহায্য করে, এবং নিরাপত্তা, ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়ক। Flask-এ কাস্টম ভ্যালিডেশন রুলস আপনাকে ফর্মের সাথে ইন্টারঅ্যাকশন সহজ এবং কার্যকরভাবে পরিচালনা করার সুবিধা দেয়।
Read more