-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7883a76
commit 9b2bf95
Showing
25 changed files
with
739 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
FLASK_APP=template.py |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
|
||
Ortami Hazirla | ||
-------------- | ||
|
||
1. virtualenv kur. | ||
2. proje dizinini hazirla. | ||
3. virtualenv dizini olustur. | ||
4. virtualenv icine gir. | ||
5. flask kur. | ||
6. dotenv kur. | ||
7. hello world uygulamasini yaz. | ||
|
||
8. Template kullanimi | ||
8.1 Template miras alma |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
from flask import Flask, request, session | ||
from config import Config | ||
from flask_sqlalchemy import SQLAlchemy | ||
from flask_migrate import Migrate | ||
from flask_login import LoginManager | ||
from flask_mail import Mail | ||
from flask_bootstrap import Bootstrap | ||
from flask_babel import Babel | ||
|
||
app = Flask(__name__) | ||
app.config.from_object(Config) | ||
db = SQLAlchemy(app) | ||
migrate = Migrate(app, db) | ||
login = LoginManager(app) | ||
login.login_view = 'login' | ||
mail = Mail(app) | ||
bootstrap = Bootstrap(app) | ||
babel = Babel(app) | ||
|
||
|
||
from app import routes, models, errors | ||
|
||
@babel.localeselector | ||
def get_locale(): | ||
try: | ||
language = session['language'] | ||
except KeyError: | ||
language = None | ||
if language is not None: | ||
return language | ||
return request.accept_languages.best_match(app.config['LANGUAGES']) | ||
|
||
@app.context_processor | ||
def inject_conf_var(): | ||
return dict( | ||
AVAILABLE_LANGUAGES=app.config['LANGUAGES'], | ||
CURRENT_LANGUAGE=session.get('language',request.accept_languages.best_match(app.config['LANGUAGES'].keys()))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
from flask_mail import Message | ||
from flask import render_template | ||
from app import app, mail | ||
from threading import Thread | ||
|
||
from flask_babel import lazy_gettext as _l | ||
|
||
def send_async_email(app, msg): | ||
with app.app_context(): | ||
mail.send(msg) | ||
|
||
def send_email(subject, sender, recipients, text_body, html_body): | ||
msg = Message(subject, sender=sender, recipients=recipients) | ||
msg.body = text_body | ||
msg.html = html_body | ||
mail.send(msg) | ||
#Thread(target=send_async_email, args=(app,msg)).start() | ||
|
||
|
||
def send_password_reset_email(user): | ||
token = user.get_reset_password_token() | ||
send_email(_l('[Flask Template] Reset Your Password'), | ||
sender=app.config['ADMINS'][0], | ||
recipients=[user.email], | ||
text_body=render_template('email/reset_password.txt', | ||
user=user, token=token), | ||
html_body=render_template('email/reset_password.html', | ||
user=user, token=token)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
from flask import render_template | ||
from app import app, db | ||
|
||
@app.errorhandler(404) | ||
def not_found_error(error): | ||
return render_template('404.html'), 404 | ||
|
||
@app.errorhandler(500) | ||
def internal_error(error): | ||
db.session.rollback() | ||
return render_template('500.html'), 500 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
from flask_wtf import FlaskForm | ||
from wtforms import StringField, TextAreaField, PasswordField, BooleanField, SubmitField | ||
from wtforms.validators import DataRequired, Length, ValidationError, Email, EqualTo | ||
from app.models import User | ||
from flask_babel import lazy_gettext as _l | ||
|
||
class LoginForm(FlaskForm): | ||
username = StringField(_l('Username'), validators=[DataRequired()]) | ||
password = PasswordField(_l('Password'), validators=[DataRequired()]) | ||
remember_me = BooleanField(_l('Remember Me')) | ||
submit = SubmitField(_l('Sign In')) | ||
|
||
|
||
class RegistrationForm(FlaskForm): | ||
username = StringField(_l('Username'), validators=[DataRequired()]) | ||
email = StringField(_l('Email'), validators=[DataRequired(), Email()]) | ||
password = PasswordField(_l('Password'), validators=[DataRequired()]) | ||
password2 = PasswordField( | ||
_l('Repeat Password'), validators=[DataRequired(), EqualTo('password')]) | ||
submit = SubmitField(_l('Register')) | ||
|
||
def validate_username(self, username): | ||
user = User.query.filter_by(username=username.data).first() | ||
if user is not None: | ||
raise ValidationError(_l('Please use a different username.')) | ||
|
||
def validate_email(self, email): | ||
user = User.query.filter_by(email=email.data).first() | ||
if user is not None: | ||
raise ValidationError(_l('Please use a different email address.')) | ||
|
||
|
||
class EditProfileForm(FlaskForm): | ||
username=StringField(_l("Username"), validators=[DataRequired()]) | ||
about_me=TextAreaField(_l("About Me"), validators=[Length(min=0,max=140)]) | ||
submit=SubmitField(_l('Submit')) | ||
|
||
def __init__(self, original_username, *args, **kwargs): | ||
super(EditProfileForm, self).__init__(*args, **kwargs) | ||
self.original_username = original_username | ||
|
||
def validate_username(self, username): | ||
if username.data != self.original_username: | ||
user = User.query.filter_by(username=self.username.data).first() | ||
if user is not None: | ||
raise ValidationError(_l('Please use a different username.')) | ||
|
||
|
||
class ResetPasswordRequestForm(FlaskForm): | ||
email = StringField(_l('Email'), validators=[DataRequired(), Email()]) | ||
submit = SubmitField(_l('Request Password Reset')) | ||
|
||
class ResetPasswordForm(FlaskForm): | ||
password = PasswordField(_l('Password'), validators=[DataRequired()]) | ||
password2 = PasswordField( | ||
_l('Repeat Password'), validators=[DataRequired(), EqualTo('password')]) | ||
submit = SubmitField(_l('Request Password Reset')) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
from app import db | ||
from app import app | ||
from app import login | ||
from flask_login import UserMixin | ||
from werkzeug.security import generate_password_hash, check_password_hash | ||
from hashlib import md5 | ||
from datetime import datetime | ||
from time import time | ||
import jwt | ||
|
||
|
||
@login.user_loader | ||
def load_user(id): | ||
return User.query.get(int(id)) | ||
|
||
|
||
class User(UserMixin, db.Model): | ||
__tablename__ = "users" | ||
id = db.Column(db.Integer, primary_key=True) | ||
username = db.Column(db.String(64), index=True, unique=True) | ||
email = db.Column(db.String(120), index=True, unique=True) | ||
password_hash = db.Column(db.String(128)) | ||
about_me = db.Column(db.String(140)) | ||
last_seen = db.Column(db.DateTime, default=datetime.utcnow) | ||
|
||
def __repr__(self): | ||
return '<User {}>'.format(self.username) | ||
|
||
def set_password(self, password): | ||
self.password_hash = generate_password_hash(password) | ||
|
||
def check_password(self, password): | ||
return check_password_hash(self.password_hash, password) | ||
|
||
def avatar(self, size): | ||
digest = md5(self.email.lower().encode('utf-8')).hexdigest() | ||
return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format( | ||
digest, size) | ||
|
||
def get_reset_password_token(self, expires_in=600): | ||
return jwt.encode( | ||
{'reset_password': self.id, 'exp': time() + expires_in}, | ||
app.config['SECRET_KEY'], algorithm='HS256').decode('utf-8') | ||
|
||
@staticmethod | ||
def verify_reset_password_token(token): | ||
try: | ||
id = jwt.decode(token, app.config['SECRET_KEY'], | ||
algorithms=['HS256'])['reset_password'] | ||
except: | ||
return | ||
return User.query.get(id) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
from flask import render_template, flash, redirect, url_for, request, session | ||
from app import app | ||
from app.forms import LoginForm, RegistrationForm, EditProfileForm | ||
from app.forms import ResetPasswordRequestForm, ResetPasswordForm | ||
from flask_login import current_user, login_user, login_required, logout_user | ||
from app.models import User | ||
from app import db | ||
from app.email import send_password_reset_email | ||
|
||
from datetime import datetime | ||
|
||
@app.route('/') | ||
@app.route('/index') | ||
@login_required | ||
def index(): | ||
return render_template('index.html', title='Ev') | ||
|
||
|
||
@app.route('/language/<language>') | ||
def set_language(language=None): | ||
session['language'] = language | ||
return redirect(request.referrer) | ||
|
||
@app.route('/login', methods=['GET','POST']) | ||
def login(): | ||
if current_user.is_authenticated: | ||
return redirect(url_for('index')) | ||
|
||
form = LoginForm() | ||
if form.validate_on_submit(): | ||
user = User.query.filter_by(username=form.username.data).first() | ||
if user is None or not user.check_password(form.password.data): | ||
flash(_l('Invalid username or password')) | ||
return redirect(url_for('login')) | ||
login_user(user, remember=form.remember_me.data) | ||
return redirect(url_for('index')) | ||
|
||
return render_template('login.html', title='Sign In', form=form) | ||
|
||
@app.route('/logout') | ||
def logout(): | ||
logout_user() | ||
return redirect(url_for('index')) | ||
|
||
@app.route('/register', methods=['GET', 'POST']) | ||
def register(): | ||
if current_user.is_authenticated: | ||
return redirect(url_for('index')) | ||
form = RegistrationForm() | ||
if form.validate_on_submit(): | ||
user = User(username=form.username.data, email=form.email.data) | ||
user.set_password(form.password.data) | ||
db.session.add(user) | ||
db.session.commit() | ||
flash(_l('Congratulations, you are now a registered user!')) | ||
return redirect(url_for('login')) | ||
return render_template('register.html', title='Register', form=form) | ||
|
||
|
||
@app.route('/user/<username>') | ||
@login_required | ||
def user(username): | ||
user = User.query.filter_by(username=username).first_or_404() | ||
return render_template('user.html', user=user) | ||
|
||
|
||
|
||
|
||
@app.route('/edit_profile', methods=['GET', 'POST']) | ||
@login_required | ||
def edit_profile(): | ||
form = EditProfileForm(current_user.username) | ||
if form.validate_on_submit(): | ||
current_user.username = form.username.data | ||
current_user.about_me = form.about_me.data | ||
db.session.commit() | ||
flash(_l('Your changes have been saved.')) | ||
return redirect(url_for('edit_profile')) | ||
elif request.method == 'GET': | ||
form.username.data = current_user.username | ||
form.about_me.data = current_user.about_me | ||
return render_template('edit_profile.html', title='Edit Profile', | ||
form=form) | ||
|
||
|
||
|
||
|
||
@app.route('/reset_password_request', methods=['GET', 'POST']) | ||
def reset_password_request(): | ||
if current_user.is_authenticated: | ||
return redirect(url_for('index')) | ||
form = ResetPasswordRequestForm() | ||
if form.validate_on_submit(): | ||
user = User.query.filter_by(email=form.email.data).first() | ||
if user: | ||
send_password_reset_email(user) | ||
flash(_l('Check your email for the instructions to reset your password')) | ||
return redirect(url_for('login')) | ||
return render_template('reset_password_request.html', | ||
title=_l('Reset Password'), form=form) | ||
|
||
|
||
@app.route('/reset_password/<token>', methods=['GET', 'POST']) | ||
def reset_password(token): | ||
if current_user.is_authenticated: | ||
return redirect(url_for('index')) | ||
user = User.verify_reset_password_token(token) | ||
if not user: | ||
return redirect(url_for('index')) | ||
form = ResetPasswordForm() | ||
if form.validate_on_submit(): | ||
user.set_password(form.password.data) | ||
db.session.commit() | ||
flash('Your password has been reset.') | ||
return redirect(url_for('login')) | ||
return render_template('reset_password.html', form=form) | ||
|
||
@app.before_request | ||
def before_request(): | ||
if current_user.is_authenticated: | ||
current_user.last_seen = datetime.utcnow() | ||
db.session.commit() | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{% extends "base.html" %} | ||
|
||
{% block app_content %} | ||
<h1>{{ _('File Not Found')}}</h1> | ||
<p><a href="{{ url_for('index') }}">{{ _('Back') }}</a></p> | ||
{% endblock %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{% extends "base.html" %} | ||
|
||
{% block app_content %} | ||
<h1>{{ _('An unexpected error has occurred') }}</h1> | ||
<p> {{ _('The administrator has been notified. Sorry for the inconvenience!') }}</p> | ||
<p><a href="{{ url_for('index') }}">{{ _('Back') }}</a></p> | ||
{% endblock %} |
Oops, something went wrong.