Work to flask derrière Nginx
This commit is contained in:
parent
083a7147ff
commit
b34695a41b
31
#README.md#
Normal file
31
#README.md#
Normal file
@ -0,0 +1,31 @@
|
||||
# Pywallter est un projet de portail communautaire pour les utilisateur d'un serveur.
|
||||
Demande- juste un identifiant et un mot de passe et voila.
|
||||
On peut y importer des fichiers que l'on pourra rendre accèssible en public par la suite.
|
||||
Je voulais tester cette idée de post-it pour que les utilisateur puisse s'échanger des messages
|
||||
ou que les admins puisse faire des annonces... On verra
|
||||
on pourrait ajoute de la double authentification mais bon ...
|
||||
|
||||
|
||||
## Pour démarrer le programme
|
||||
|
||||
### Sur OpenBSD (7.1)
|
||||
Il faut installer FLask et quelques dépendances
|
||||
pkg_add py3-werkzeug py3-jinja2 py3-Pillow py3-wtforms py3-flask-wtf py3-flask \
|
||||
py3-bcrypt py3-markdown py3-gevent py3-zopeinterface
|
||||
### Sur Debian (A venir)
|
||||
apt install python3-flask python3-flask-bcrypt python3-wtforms python3-pil python3-markdown
|
||||
### Ensuite dans le dossier du projet tu fais :
|
||||
|
||||
$ export FLASK_APP=pywallter.py
|
||||
$ flask run
|
||||
|
||||
#### En serveur de production
|
||||
$ python3 wsgi.py
|
||||
|
||||
Et ça devrait démarrer sans soucis.
|
||||
|
||||
## Support serveru MAIL et XMPP
|
||||
|
||||
Le logiciel a besoin de opensmtpd et prosody pour fonctionner.
|
||||
Le serveur mail et xmmp se base sur le domain de la machine.
|
||||
Les scripts dans le dossier scripts sont la à titre d'exemple et peuvent être copié
|
6
#wsgi.py#
Normal file
6
#wsgi.py#
Normal file
@ -0,0 +1,6 @@
|
||||
from gevent.pywsgi import WSGIServer
|
||||
from pywallter import create_app
|
||||
|
||||
app = create_app()
|
||||
http_server = WSGIServer(("127.0.0.1", 8000), app)
|
||||
http_server.serve_forever()
|
@ -1,8 +1,13 @@
|
||||
|
||||
# L'adresse de base de votre site.
|
||||
# example BASE_URL="http://localhost/"
|
||||
BASE_URL="https://example.con/"
|
||||
|
||||
# Essentiels pour les cookies
|
||||
SECRET_KEY="fksmlfkljklknfzqlknfzqlkezq"
|
||||
SECRET_KEY="CHANGE ME"
|
||||
|
||||
# Dossier où seront stocker les fichiers
|
||||
DOSSIER_APP = "users/"
|
||||
DOSSIER_APP = "./users/"
|
||||
|
||||
# Fichiers sqlite
|
||||
DATABASE = "./base.db"
|
||||
|
@ -80,7 +80,8 @@ def create_app():
|
||||
app.register_blueprint(profil)
|
||||
app.register_blueprint(logs)
|
||||
app.register_blueprint(loginlogout)
|
||||
|
||||
app.register_blueprint(mygallery)
|
||||
|
||||
return app
|
||||
|
||||
if __name__ == '__main__' :
|
||||
|
@ -36,8 +36,6 @@
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||||
<span class="glyphicon glyphicon-comment" aria-hidden="true"></span> Ma Messagerie </a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="/mymailbox/"> <span class="glyphicon glyphicon-lock" aria-hidden="true"></span>
|
||||
Changer mon mot de passe </a></li>
|
||||
<li><a href="/mymailbox/alias"><span class="glyphicon glyphicon-sunglasses" aria-hidden="true"></span>
|
||||
Gerer mes alias</a></li>
|
||||
|
||||
@ -50,11 +48,11 @@
|
||||
</a>
|
||||
</li>
|
||||
<li {% if section == "Profil" %} class="dropdown active" {% else %} class="dropdown" {% endif %}>
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-home" aria-hidden="true"></span> <span id="majuscule">{{ session['username'] }} </span><span class="caret"></span></a>
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span class="glyphicon glyphicon-home" aria-hidden="true"></span> <span id="majuscule">{{ session['username'] }} </span><span class="caret"></span></a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="/profil/"><span class="glyphicon glyphicon-user" aria-hidden="true"></span> Profil</a></li>
|
||||
<li><a href="/parametres/"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span> Paramètres</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="/profil/change-password/"> <span class="glyphicon glyphicon-lock" aria-hidden="true"></span>
|
||||
Changer mon mot de passe </a></li>
|
||||
<li><a href="/invitation/"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span> Inviter une personne</a></li>
|
||||
<!--<li class="dropdown-header">Nav header</li>-->
|
||||
</ul>
|
||||
|
@ -27,7 +27,7 @@
|
||||
<br>
|
||||
|
||||
{% if signin_enable %}
|
||||
<form method="POST" action="{{ base_url }}">
|
||||
<form method="POST" action="{{ url_inscription }}">
|
||||
<input type="text" name="user" id="user" placeholder="Pseudo" class="form-control"><br />
|
||||
<div class="col-sm-7">
|
||||
<input type="text" name="mail" id="mail" placeholder="Adresse mail" class="form-control" size="2"> <br/>
|
||||
|
@ -21,8 +21,8 @@
|
||||
{% if token %}
|
||||
<h3> Votre lien d'inscription en cours: </h3>
|
||||
|
||||
<a href="{{ base_url }}/{{ token }}">
|
||||
{{base_url }}/{{ token }}
|
||||
<a href="{{ url_invitation }}">
|
||||
{{ url_invitation }}
|
||||
</a>
|
||||
{% else %}
|
||||
<h3> Pas d'invitation en attente </h3>
|
||||
|
@ -18,6 +18,8 @@ DOSSIER_PERSO= app.config['DOSSIER_APP']
|
||||
extensionimg = app.config['EXT_IMG']
|
||||
|
||||
DATABASE = app.config['DATABASE']
|
||||
|
||||
BASE_URL = app.config['BASE_URL']
|
||||
##################################################################################################
|
||||
|
||||
|
||||
@ -55,7 +57,7 @@ def racine_blog():
|
||||
conn.close()
|
||||
return render_template('blog.html', section='Post-it', posts=posts)
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
|
||||
|
||||
@ -69,7 +71,7 @@ def delete(post):
|
||||
conn.close()
|
||||
return redirect(url_for('post-it.racine_blog'))
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401) # sinon on redirige vers login
|
||||
return redirect(BASE_URL, code=401) # sinon on redirige vers login
|
||||
|
||||
@postit.route('/edit/<post>', methods=['GET', 'POST'])
|
||||
def edit(post):
|
||||
@ -96,7 +98,7 @@ def edit(post):
|
||||
oldpost=oldpost)
|
||||
else:
|
||||
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401) # sinon on redirige vers login)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@postit.route('/postit/board', methods=['GET'])
|
||||
def viewsheet():
|
||||
@ -110,4 +112,4 @@ def viewsheet():
|
||||
conn.close()
|
||||
return render_template('board.html', section='Post-it', posts=posts)
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
@ -21,6 +21,8 @@ DOSSIER_PERSO= app.config['DOSSIER_APP']
|
||||
extensionimg = app.config['EXT_IMG']
|
||||
|
||||
DATABASE = app.config['DATABASE']
|
||||
|
||||
BASE_URL= app.config['BASE_URL']
|
||||
##################################################################################################
|
||||
|
||||
@filesupload.route( '/filesupload/', methods=['GET', 'POST'])
|
||||
@ -81,7 +83,7 @@ def uploadfiles():
|
||||
resp.set_cookie('username', session['username'])
|
||||
return resp
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
|
||||
@filesupload.route('/view/')
|
||||
@ -103,9 +105,9 @@ def list():
|
||||
listeFichiers=listeFichiers)
|
||||
else :
|
||||
flash(u'Aucun fichier uploadé ! Redirection vers Upload', 'error')
|
||||
return redirect(url_for('filesupload.uploadfiles', external=True))
|
||||
return redirect(url_for('filesupload.uploadfiles'))
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@filesupload.route('/myfiles/<filename>')
|
||||
def myfiles(filename):
|
||||
@ -114,7 +116,7 @@ def myfiles(filename):
|
||||
return send_from_directory(
|
||||
os.path.join(DOSSIER_PERSO, UTILISATEUR, 'files'), filename )
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login'), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@filesupload.route('/remove/<nom>')
|
||||
def remove(nom):
|
||||
@ -134,4 +136,4 @@ def remove(nom):
|
||||
return redirect(url_for('filesupload.list', _external=True)) # sinon on redirige vers la liste, avec un message d'erreur
|
||||
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login'), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
@ -43,7 +43,7 @@ def myimg(filename):
|
||||
return send_from_directory(
|
||||
os.path.join(DOSSIER_PERSO, UTILISATEUR, 'images'), filename )
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login'), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@mygallery.route('/myfiles/images/thumbnails/<filename>')
|
||||
def mythumbnails(filename):
|
||||
@ -52,4 +52,4 @@ def mythumbnails(filename):
|
||||
return send_from_directory(
|
||||
os.path.join(DOSSIER_PERSO, UTILISATEUR, 'images/thumbnails'), filename )
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login'), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
@ -18,6 +18,8 @@ DATABASE = app.config['DATABASE']
|
||||
MAIL_SERVER = app.config['MAIL_SERVER']
|
||||
XMMP_SERVER = app.config['XMPP_SERVER']
|
||||
SETUID = app.config['SETUID']
|
||||
BASE_URL = app.config['BASE_URL']
|
||||
|
||||
#################################################################################################
|
||||
|
||||
|
||||
@ -103,17 +105,18 @@ def signin(token) :
|
||||
conn.commit()
|
||||
|
||||
flash(u'Inscription réalisée avec succés !', 'succes')
|
||||
resp = redirect(url_for('loginlogout.login', _external=True))
|
||||
resp = redirect(url_for('loginlogout.login'))
|
||||
else:
|
||||
flash(u'Les mots de passe ne sont pas identiques !', 'error')
|
||||
resp = render_template('inscription.html',
|
||||
signin_enable=app.config['SIGNIN_ENABLE'],
|
||||
hostname=hostname)
|
||||
else :
|
||||
url_inscription = BASE_URL+'invitation/'+token
|
||||
resp = render_template('inscription.html',
|
||||
signin_enable=app.config['SIGNIN_ENABLE'],
|
||||
token=token, hostname=hostname, base_url=request.base_url)
|
||||
token=token, hostname=hostname, url_inscription=url_inscription)
|
||||
else:
|
||||
resp = redirect(url_for('index', _external=True), code=401)
|
||||
resp = redirect(BASE_URL, code=401)
|
||||
|
||||
return resp
|
||||
|
@ -26,6 +26,8 @@ DATABASE = app.config['DATABASE']
|
||||
MAIL_SERVER = app.config['MAIL_SERVER']
|
||||
XMPP_SERVER = app.config['XMPP_SERVER']
|
||||
SETUID = app.config['SETUID']
|
||||
BASE_URL = app.config['BASE_URL']
|
||||
|
||||
##################################################################################################
|
||||
|
||||
|
||||
@ -105,7 +107,7 @@ def profile() :
|
||||
username=UTILISATEUR)
|
||||
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@profil.route('/profil/change-password/', methods=['GET','POST'] )
|
||||
def change_passwd() :
|
||||
@ -156,13 +158,13 @@ def change_passwd() :
|
||||
|
||||
conn.close()
|
||||
return render_template('mailbox.html',
|
||||
section="mailbox",
|
||||
section="Profil",
|
||||
address=mailbox['Mail'],
|
||||
alias=mailbox['alias'],
|
||||
username=UTILISATEUR)
|
||||
|
||||
else :
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
|
||||
@profil.route('/mymailbox/alias', methods=['GET', 'POST'] )
|
||||
@ -223,7 +225,7 @@ def myalias():
|
||||
username=UTILISATEUR )
|
||||
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@profil.route('/mymailbox/rmalias/<aliasrm>')
|
||||
def remove_alias(aliasrm):
|
||||
@ -261,7 +263,7 @@ def remove_alias(aliasrm):
|
||||
|
||||
return redirect(url_for('profil.myalias', _external=True))
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@profil.route('/invitation/', methods=['GET'])
|
||||
def invitation():
|
||||
@ -271,19 +273,18 @@ def invitation():
|
||||
cursor = conn.cursor() # Création de l'objet "curseur"
|
||||
cursor.execute("""SELECT Token, invitations FROM users WHERE name=?""", (UTILISATEUR,))
|
||||
tmp = cursor.fetchone()
|
||||
print (tmp)
|
||||
print (tmp[0])
|
||||
token = tmp[0]
|
||||
invitations_count = tmp[1]
|
||||
conn.close()
|
||||
base_url = request.base_url
|
||||
base_url = base_url.replace("/invitation/", "inscription")
|
||||
url_invitation = BASE_URL + 'inscription/' + token
|
||||
return render_template('invitation.html',
|
||||
section='Profil',
|
||||
token=token,
|
||||
nb_invitation=invitations_count,
|
||||
base_url=base_url)
|
||||
token=token,
|
||||
url_invitation=url_invitation)
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
||||
@profil.route('/gen_token/', methods=['GET'])
|
||||
def generate_token():
|
||||
@ -296,7 +297,6 @@ def generate_token():
|
||||
(token, UTILISATEUR))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return redirect(url_for('profil.invitation', _external=True))
|
||||
|
||||
return redirect(BASE_URL+'invitation/')
|
||||
else:
|
||||
return redirect(url_for('loginlogout.login', _external=True), code=401)
|
||||
return redirect(BASE_URL, code=401)
|
||||
|
Loading…
Reference in New Issue
Block a user