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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user