Flask (parte 5): password security

luglio 1, 2015 1 commento

La sicurezza di un sito, passa per la autenticazione di un utente
(user authentication) e per la gestione della password collegata ad
esso.

E’ buona usanza non registrare nel database la password di un utente,
bensì l’HASH relativo ad essa.
Queste operazioni vengono gestite facilmente con Werkzeug:

nel caso non lo avessimo ancora installato

(venv) >pip install werkzeug

Werkzeug ci mette a disposizione semplicemente due funzioni:

generate_password_hash(password, method=pbkdf2:sha1, salt_length=8)
check_password_hash(hash, password)

il loro utilizzo è molto semplice, prima però di vedere come utilizzare
questo strumento, modifichiamo il model User:

from . import db
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    teams = db.relationship('Team', backref='user')
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))
    
    def __repr__(self):
        return "<User %r>" % self.username

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

Abbiamo aggiunto il campo password_hash nel model User, pertanto
dobbiamo migrare e aggiornare il database:

(venv) >python manage.py db migrate -m "password_hash field added to User"
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added column 'users.password_hash'
Generating >fantamanager\migrations\versions\ea1a33541f6_password_hash_field_added_to_user.py ... done

(venv) >python manage.py db upgrade
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade 3f1bfb116a2 -> ea1a33541f6, password_hash field added to User

facciamo ora una prova da shell:

>>> u1 = User.query.get(1)
>>> u1.password = "rosso"
>>> u1.password_hash
'pbkdf2:sha1:1000$ZDq916DS$860f7130f1e822998518f99ef078b9be11613f15'
>>> u2 = User.query.get(2)
>>> u2.password = "verde"
>>> u2.password_hash
'pbkdf2:sha1:1000$ujESM9bp$dae6906b4eb6359cf5410c469f1ae82f9664b9fb'

Nel caso dessi ad uno User la stessa password di un altro:

>>> u3 = User.query.get(3)
>>> u3.password = "verde"
>>> u3.password_hash == u2.password_hash
False

Grazie alla property, se proviamo ad accedere in lettura all’attributo password,
si solleva un’eccezione:

>>> u3.password
...
AttributeError: password is not a readable attribute

Questo meccanismo va testato, pertanto nell dir tests della nostra applicazione,
scriviamo un test in modo da tutelarci da sorprese in caso di modifiche future

Creiamo il file tests/test_user_pw_hashing.py

import unittest
from app.models import User


class UserModelTestCase(unittest.TestCase):

    def setUp(self):
        self.user_1 = User(password='rosso')
        self.user_2 = User(password='rosso')      

    def test_password_setter(self):
        self.assertTrue(self.user_1.password_hash is not None)

    def test_no_password_getter(self):
        with self.assertRaises(AttributeError):
            self.user_1.password

    def test_password_verification(self):
        self.assertTrue(self.user_1.verify_password('rosso'))
        self.assertFalse(self.user_1.verify_password('verde'))

    def test_password_salts_are_random(self):
        self.assertTrue(self.user_1.password_hash != \
                        self.user_2.password_hash)

e modifichiamo il file manage.py per lanciare comodamente i test:

#!/usr/bin/env python
...
import unittest
...

@manager.command
def test():
    """Run the unit tests."""
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)
...

ora possiamo lanciare il comando “test”:

(venv) >python manage.py test
test_no_password_getter (test_user_pw_hashing.UserModelTestCase) ... ok
test_password_salts_are_random (test_user_pw_hashing.UserModelTestCase) ... ok
test_password_setter (test_user_pw_hashing.UserModelTestCase) ... ok
test_password_verification (test_user_pw_hashing.UserModelTestCase) ... ok

----------------------------------------------------------------------
Ran 4 tests in 0.086s

OK

articolo successivo:

articoli precedenti:
Flask (parte 1): virtualenv
Flask (parte 2): struttura progetto complesso
Flask (parte 3): database
Flask (parte 4): views e templates

Categorie:flask, python Tags: ,

Flask (parte 4): views e templates

giugno 30, 2015 2 commenti

Quando un client (ad es. un web browser) manda una richiesta al web server, questi
la gira all’istanza “app” di Flask che deve riconoscere l’URL richiesta ed
eseguire il codice ad essa associato.
Questo avviene tramite funzioni dette views, che vengono associate ad un determinato url,
per mezzo del decoratore @app.route.

Se lanciassimo il server ora, con il comando:

python manage.py runserver
(venv) ...>python manage.py runserver
 * Running on http://127.0.0.1:5000/
 * Restarting with reloader

visitando la pagina indicataci http://127.0.0.1:5000/
ci troveremmo di fronte ad una bella pagina di errore

ValueError: View function did not return a response

Questo perchè non esiste ancora nessuna view associata alla route (“/”) del sito,
per fare questo, apriamo il file app/main/views.py

from flask import render_template
from . import main

@main.route('/', methods=['GET', 'POST'])
def index():
    return render_template('index.html')

creata la view, dobbiamo creare anche la template, gestite da Jinja2.
Creiamo il file app/templates/index.html

<h1>Welcome to Fantamanager!</h1>

ora lanciando il server e visitando la pagina, dovremmo vedere il nostro messaggio di benvenuto.

E se volessimo passare un argomento alla template?
la funzione render_template, accetta argomenti da passare alla template ad es. (app/main/views.py):

from flask import render_template
from . import main

@main.route('/', methods=['GET', 'POST'])
def index():
    name = "bancaldo"
    return render_template('index.html', name=name)

All’interno della template, gli argomenti si inseriscono tramite la doppia graffa:

<h1>{{ name }}, welcome to Fantamanager!</h1>

Ora creiamo una view che ci dia delle informazioni prelevate dal database, creiamo un po’ di users:

python manage.py shell
>>> for name in ("pippo", "pluto", "paperino"):
...     u = User(username=name, email="{}@example.com".format(name))
...     db.session.add(u)
...
>>> db.session.commit()
>>> User.query.all()
[<User u'pippo'>, <User u'pluto'>, <User u'paperino'>]

Ora vorrei una pagina che mi elencasse tutti gli users, quindi andiamo sul file
app/main/views.py e creiamo la views. Per prelavare dati dal database, ovviamente
abbiamo bisogno di importare l’oggetto User da models.py quindi:

from ..models import User
#...
@main.route('/users', methods=['GET', 'POST'])
def users():
    users = User.query.all()
    return render_template('users.html', users=users)

Creiamo la template relativa agli users, app/templates/users.html
Jinja2 oltre a passare argomenti, utilizza strutture di controllo e in questo caso
utilizzeremo un ciclo for:

<ul>
{% for user in users %}
	<li>{{ user.username }} mail to: {{ user.email}}</li>
{% endfor %}
</ul>

se rilanciamo il server e visitiamo la pagina http://127.0.0.1:5000/users
troviamo la nostra lista users.

Grazie a Jinja2 le template possono utilizzare l’ereditarietà ovvero è possibile
creare una template base.html:

<html>

<head>
    {% block head %}
        <title>{% block title %}{% endblock %} - Fantamanager</title>
    {% endblock %}
</head>

<body>
    {% block body %}
    {% endblock %}
</body>

</html>

ed estenderla, solo nei blocchi interessati, nelle singole templates.
In questo modo il codice verrà sempre modificato in un unico punto e non
su tutte le singole templates. Nel caso di prima, la template derivante sarà:

{% extends "base.html" %}

{% block title %}Users{% endblock %}

{% block body %}
    <ul>
    {% for user in users %}
	<li>{{ user.username }} mail to: {{ user.email}}</li>
    {% endfor %}
    </ul>
{% endblock %}

Adesso vediamo lo stile, che come ci siamo resi conto dal nostro browser,
è veramente scarno.
Per ottenere qualcosa di più appetibile visivamente, possiamo integrare il
framework Bootstrap, derivato da twitter. Essendo questa un’estensione di
Flask, sarà molto semplice installarla.
Sempre da venv, installiamo l’estensione:

C:\fantamanager>venv\Scripts\activate
(venv) C:\fantamanager>pip install flask-bootstrap
Collecting flask-bootstrap
...
Successfully installed flask-bootstrap-3.3.5.2

Ora lo registriamo nel nostro costruttore (app/__init__.py):

#...
from flask.ext.bootstrap import Bootstrap
#...


bootstrap = Bootstrap()
#...


def create_app(config_name):
    #...
    bootstrap.init_app(app)
    #...

    return app

Dopo l’installazione, sarà disponibile una template base.html di
bootstrap, dalla quale derivare tutte le altre.
Il nuovo codice della template users.html diventerà:

{% extends "bootstrap/base.html" %}

{% block title %}Users{% endblock %}

{% block navbar %}
	<div class="navbar navbar-inverse" role="navigation">
		<div class="container">
			<div class="navbar-header">
				<button type="button" class="navbar-toggle"
				data-toggle="collapse" data-target=".navbar-collapse">
					<span class="sr-only">Toggle navigation</span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
				</button>
				<a class="navbar-brand" href="/">Home</a>
				</div>
		</div>
	</div>
{% endblock %}

{% block content %}
	<div class="container">
		<div class="page-header">
			<ul>
			{% for user in users %}
			<li>{{ user.username }} mail to: {{ user.email}}</li>
			{% endfor %}
			</ul>
		</div>
	</div>
{% endblock %}

Index diventerà:

{% extends "bootstrap/base.html" %}

{% block title %}Users{% endblock %}

{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
  <div class="container">
    <div class="navbar-header">
	<button type="button" class="navbar-toggle"
	 data-toggle="collapse" data-target=".navbar-collapse">
          <span class="sr-only">Toggle navigation</span>
          <span class="icon-bar"></span>
	  <span class="icon-bar"></span>
	  <span class="icon-bar"></span>
	</button><a class="navbar-brand" href="/users">Users</a>
    </div>
  </div>
</div>
{% endblock %}

{% block content %}
  <h1>{{ name }}, welcome to Fantamanager!</h1>
{% endblock %}

Le navigation bar contengono già i link delle rispettive pagine di esempio alle
quali reindirizzare il browser.

Ultima cosa da sapere.
Se volessimo catturare un argomento dall’url immesso dal client e generare una vista personalizzata?
Bisogna catturare l’argomento desiderato nella vista, racchiudendolo tra , es.

from flask import render_template, redirect, url_for
from ..models import User
from . import main


@main.route('/', methods=['GET'])
def index():
    return render_template('index.html')

@main.route('/users', methods=['GET'])
def users():
    allusers = User.query.all()
    return render_template('users.html', users=allusers)

@main.route('/user/<name>', methods=['GET'])
def user(name):
    user = User.query.filter_by(username=name.lower()).first()
    if not user:
        return redirect(url_for('.index'))
    return render_template('user.html', user=user)

e la template user.html sarà:

{% extends "bootstrap/base.html" %}

{% block title %}Users{% endblock %}

{% block navbar %}
	<div class="navbar navbar-inverse" role="navigation">
		<div class="container">
			<div class="navbar-header">
				<button type="button" class="navbar-toggle"
				data-toggle="collapse" data-target=".navbar-collapse">
					<span class="sr-only">Toggle navigation</span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
					<span class="icon-bar"></span>
				</button>
				<a class="navbar-brand" href="/">Home</a>
				</div>
		</div>
	</div>
{% endblock %}

{% block content %}
  <div class="container">
    <h1>Welcome {{ user.username }}</h1>
    <div class="page-header">
      <ul>username: {{ user.username }}</ul>
      <ul>email: {{ user.email }}</ul>
    </div>
  </div>
{% endblock %}

index.html va poi rivista, poichè nell’ultmia versione importava l’argomento “name” che ora non serve più.

articolo successivo:
Flask (parte 5): password security

articoli precedenti:
Flask (parte 1): virtualenv
Flask (parte 2): struttura progetto complesso
Flask (parte 3): database

Categorie:flask, python Tags: ,

Flask (parte 3): database

giugno 30, 2015 3 commenti

Cominciamo a definire il database definendo gli oggetti che rappresenteranno le entità
in relazione tra loro.
Nel file fantamanager/app/models.py cominciamo con l’importare ciò di cui abbiamo bisogno:

from . import db
from datetime import datetime

con la prima linea di codice torniamo indietro di una posizione (app) e trovando un
file __init__.py dove abbiamo definito db, lo importiamo

Ora definiamo degli oggetti molto scarni, con solo un id rappresentativo e la relazione
che lega una entità, all’altra.



class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    teams = db.relationship('Team', backref='user')


# M2M secondary tables
leagues_teams = db.Table('leagues_teams',
                         db.Column('league_id', db.Integer,
                                   db.ForeignKey('leagues.id')),
                         db.Column('team_id', db.Integer,
                                   db.ForeignKey('teams.id')))


# M2M secondary Association object
class LineupsPlayers(db.Model):
    __tablename__ = 'lineups_players'
    player_id = db.Column(db.Integer, db.ForeignKey('players.id'),
                          primary_key=True)
    lineup_id = db.Column(db.Integer, db.ForeignKey('lineups.id'),
                          primary_key=True)
    player = db.relationship('Player',
                             backref=db.backref('form_ass', lazy='dynamic'))
    position = db.Column(db.Integer)


class League(db.Model):
    __tablename__ = 'leagues'
    id = db.Column(db.Integer, primary_key=True)
    matches = db.relationship('Match', backref='league', lazy='dynamic')
    teams = db.relationship('Team', secondary=leagues_teams,
                            backref=db.backref('all_leagues', lazy='dynamic'),
                            lazy='dynamic')


class Team(db.Model):
    __tablename__ = 'teams'
    id = db.Column(db.Integer, primary_key=True)
    leagues = db.relationship('League', secondary=leagues_teams,
                              backref=db.backref('all_teams', lazy='dynamic'),
                              lazy='dynamic')
    players = db.relationship('Player', backref='team', lazy='dynamic')
    lineups = db.relationship('Lineup', backref='team', lazy='dynamic')
    trades = db.relationship('Trade', backref='team', lazy='dynamic')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))


class Player(db.Model):
    __tablename__ = 'players'
    id = db.Column(db.Integer, primary_key=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'),)
    evaluations = db.relationship('Evaluation', backref='player',
                                  lazy='dynamic')


class Match (db.Model):
    __tablename__ = 'matches'
    id = db.Column(db.Integer, primary_key=True)
    league_id = db.Column(db.Integer, db.ForeignKey('leagues.id'))
    home_id = db.Column(db.Integer, db.ForeignKey('teams.id'),)
    visit_id = db.Column(db.Integer, db.ForeignKey('teams.id'),)
    home = db.relationship('Team', foreign_keys='Match.home_id',
                           primaryjoin="Match.home_id==Team.id")
    visit = db.relationship('Team', foreign_keys='Match.visit_id',
                            primaryjoin="Match.visit_id==Team.id")


class Lineup (db.Model):
    __tablename__ = 'lineups'
    id = db.Column(db.Integer, primary_key=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
    players = db.relationship('Player', secondary='lineups_players',
                              backref=db.backref('lineups', lazy='dynamic'))

    def get_players_by_position(self):
        lu_players = LineupsPlayers.query.filter_by(lineup_id=self.id).order_by(
                        LineupsPlayers.position).all()
        if lu_players:
            return [rec.player for rec in lu_players]


class Evaluation(db.Model):
    __tablename__ = 'evaluations'
    id = db.Column(db.Integer, primary_key=True)
    player_id = db.Column(db.Integer, db.ForeignKey('players.id'))


class Trade(db.Model):
    __tablename__ = 'trades'
    id = db.Column(db.Integer, primary_key=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'),)
    player_id = db.Column(db.Integer, db.ForeignKey('players.id'),)
    player = db.relationship('Player', foreign_keys='Trade.player_id',
                             primaryjoin="Trade.player_id==Player.id")

Sommariamente:
User è in relazione “uno a molti” con Team poichè come utente posso
partecipare con più squadre. mentre una squadra non può essere di più utenti.
League è in relazione “molti a molti” con Team, poichè si potrebbe, parallelamente
alla League, partecipare anche ad una coppa con la stessa squadra.
Team è in relazione “uno a molti” con Player, poichè un giocatore non può
far parte di più squadre. Qui si acuista un giocatore tramite asta.
E così via per le altre entità.

Cominciamo a creare il database poi, per gradi, aggiungeremo i campi che
ci servono grazie alle migrations.
Portiamoci al livello di fantamanager/manage.py e se abbiamo ancora la dir migrations,
rappresentativa della struttura di un progetto complesso, rimuoviamola.
Ora lanciamo il comando di inizializzazione del database:

python manage.py db init

(su ubuntu si può omettere il comando python, avendo utilizzato il shebang)

>python manage.py db init
Creating directory ...\fantamanager\migrations ... done
Creating directory ...\fantamanager\migrations\versions ... done
...

il db non è ancora stato creato, ma possiamo notare che la dir migration è stata creata.
Procediamo con il comando che genererà il primo script di migration:

python manage.py db migrate -m "first migration"

e il comando che rende la modifica permanente:

python manage.py db upgrade
>python manage.py db upgrade
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.

Ora apriamo il file manage.py e rendiamo disponibili per la shell tutti gli
oggetti, in modo da non reimportarli ogni volta.
La funzione make_shell_context sarà:

def make_shell_context():
    return dict(app=app, db=db,
                User=User, LineupsPlayers=LineupsPlayers,
                League=League, Team=Team, Player=Player,
                Match=Match, Lineup=Lineup,
                Evaluation=Evaluation, Trade=Trade)

Ora sistemiamo i nostri oggetti nel file models.py inquanto non
abbiamo inserito nessun campo, ma solo le relazioni tra gli oggetti stessi

es di User, League e Team migliorati:

#...

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    teams = db.relationship('Team', backref='user')
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)

#...

class League(db.Model):
    __tablename__ = 'leagues'
    id = db.Column(db.Integer, primary_key=True)
    matches = db.relationship('Match', backref='league', lazy='dynamic')
    teams = db.relationship('Team', secondary=leagues_teams,
                            backref=db.backref('all_leagues', lazy='dynamic'),
                            lazy='dynamic')
    name = db.Column(db.String(40), unique=True)
    budget = db.Column(db.Integer)
    max_trades = db.Column(db.Integer)
    max_goalkeepers = db.Column(db.Integer)
    max_defenders = db.Column(db.Integer)
    max_midfielders = db.Column(db.Integer)
    max_forwards = db.Column(db.Integer)
    rounds = db.Column(db.Integer)
    offset = db.Column(db.Integer)

#...

class Team(db.Model):
    __tablename__ = 'teams'
    id = db.Column(db.Integer, primary_key=True)
    leagues = db.relationship('League', secondary=leagues_teams,
                              backref=db.backref('all_teams', lazy='dynamic'),
                              lazy='dynamic')
    players = db.relationship('Player', backref='team', lazy='dynamic')
    lineups = db.relationship('Lineup', backref='team', lazy='dynamic')
    trades = db.relationship('Trade', backref='team', lazy='dynamic')
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    name = db.Column(db.String(50), unique=True)
    budget = db.Column(db.Integer())
    max_trades = db.Column(db.Integer())


#...

creiamo la seconda migration con il comando:

python manage.py db migrate -m "user, team, league fields added"
>python manage.py db migrate -m "user, team, league fields added"
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'users'
INFO  [alembic.autogenerate.compare] Detected added index 'ix_users_email' on '['email']'
INFO  [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']'
INFO  [alembic.autogenerate.compare] Detected added table 'leagues'
INFO  [alembic.autogenerate.compare] Detected added table 'matches'
INFO  [alembic.autogenerate.compare] Detected added table 'teams'
INFO  [alembic.autogenerate.compare] Detected added table 'trades'
INFO  [alembic.autogenerate.compare] Detected added table 'leagues_teams'
INFO  [alembic.autogenerate.compare] Detected added table 'players'
INFO  [alembic.autogenerate.compare] Detected added table 'lineups'
INFO  [alembic.autogenerate.compare] Detected added table 'lineups_players'
INFO  [alembic.autogenerate.compare] Detected added table 'evaluations'
Generating C:\fantamanager\migrations\versions\3ebec3a59744_user_team_league_fields_added.py ... done

lo script di migration è generato, per renderlo effettivo facciamo l’upgrade:

python manage.py db upgrade

Nel caso si volesse tornare indietro, basterà al posto di “upgrade” utilizzare “downgrade”

>python manage.py db upgrade
INFO  [alembic.migration] Context impl SQLiteImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade  -> 3ebec3a59744, user, team, league fields added

Ora possiamo entrare nella shell furba con il comando:

python manage.py shell

Creiamo un paio di Users senza salvarli su db:

>>> u1 = User(username="user_1", email="user_1@example.com")
>>> u2 = User(username="user_2", email="user_2@example.com")

i dati senza il comando “add” e “commit” non sono salvati, infatti:

>>> User.query.all()
[]

se richiamiamo le istanze di User create, ci accorgiamo che non
sono proprio riconoscibili infatti:

>>> u1
<app.models.User object at 0x039A9E30>
>>> u2
<app.models.User object at 0x039A9270>

Per renderle più amichevoli, dobbiamo utilizzare il metodo __repr__

>>> def myrepr(self):
...     return "<User %r>" % self.username
...
>>> User.__repr__ = myrepr
>>> u1
<User 'user_1'>
>>> u2
<User 'user_2'>

Ok, visto che ci piace, rendiamo effettiva questa modifica nel file models.py
aggiungendo il metodo __repr__ in ogni classe, come più ci piace.
Ora che abbiamo visto come lavorare sul database, modificandolo, focalizziamoci
sulle singole classi per introdurre anche le view e le template.

articolo successivo:
Flask (parte 4): views e templates

articoli precedenti:
Flask (parte 1): virtualenv
Flask (parte 2): struttura progetto complesso

Categorie:flask, python Tags: ,

Flask (parte 2): struttura progetto complesso

giugno 26, 2015 4 commenti

Come si può notare nella maggiorparte delle guide presenti sul web, molto spesso gli esempi sono codificati
all’interno di un unico script, eccezion fatta per le templates che devono risiedere in una sottodirectory “templates”.
Utilizzando però un unico modulo, al crescere della complessità dell’applicazione, cresce anche la difficoltà
di gestione del codice stesso.
Flask non dà direttive in merito pertanto lo sviluppatore di turno può agire come crede.
Una buona soluzione, guarda caso, la si trova al capitolo 7 del libro di Grinberg e ne
mostrerò qui la struttura:

|-fantamanager
  |-app/
    |-templates/
    |-static/
    |-main/
      |-__init__.py
      |-errors.py
      |-forms.py
      |-views.py
    |-__init__.py
    |-email.py
    |-models.py
  |-migrations/
  |-tests/
    |-__init__.py
    |-test*.py
  |-venv/
  |-requirements.txt
  |-config.py
  |-manage.py

Questa struttura è composta da 4 directories principali…

app: il package dove risiede la Flask-application
migrations: dove risiedono i migrations-scripts che vedremo dopo
tests: il package dove risiedono gli Unit tests
venv: l’ambiente virtuale trattato nella parte 1

…e da 3 file fondamentali:

requirements.txt: contenente le dipendenze della nostra applicazione (parte 1)
config.py: contenente tutte le configurazioni e i settaggi della app
manage.py: lo script che lancia la nostra applicazione.

Da qui in avanti cominceremo a mettere il codice al posto giusto e lo analizzeremo passo
passo.

Per questa parte sono necessari 3 moduli che andremo ad installare:

(venv) >pip install flask-script flask-sqlalchemy flask-migrate

poi periodicamente o alla fine, è bene rinfrescare il file requirements.txt con il comando:

(venv) >pip freeze>requirements.txt

Il file Config

Di requirements.txt abbiamo già parlato, vediamo config.py:

import os
basedir = os.path.abspath(os.path.dirname(__file__))


class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FANTAMANAGER_MAIL_SUBJECT_PREFIX = '[FANTAMANAGER]'
    FANTAMANAGER_MAIL_SENDER = 'FANTAMANAGER Admin <FANTAMANAGER@example.com>'
    FANTAMANAGER_ADMIN = os.environ.get('FANTAMANAGER_ADMIN')

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Config):
    DEBUG = True
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')


class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')


class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')


config = {'development': DevelopmentConfig,
          'testing': TestingConfig,
          'production': ProductionConfig,
          'default': DevelopmentConfig}

La classe Config contiene i settaggi comuni alle altre configurazioni, le altre classi invece
si distinguono tra loro in base ai diversi settaggi ed ognuna subclassa la prima.
Tutte queste classi vengono registrate in un dizionario “config”.

Tutti i valori di tali variabili, sono raggiungibili tramite il dizionario os.environ.
In questo modo possono essere settate in maniera invisibile da shell e poi recuperate (password, email, username, ecc),
senza la necessità di mostrarle nel codice sorgente.

(venv) C:\fantamanager>set SECRET_VAR=secretvalue

(venv) C:\fantamanager>python
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ.get("SECRET_VAR")
'secretvalue'

Nella superclass Config viene definito anche un metodo di classe init_app, che accetta come
argomento app e permette, in caso di necessità, nelle varie sottoclassi di configurazione, di specializzare
l’inizializzazione della app stessa.

Per capire il funzionamento dell’applicazione, parleremo ora di application package e application factory.
Prima un passo indietro.
Quando negli esempi classici (unico file) viene creata l’applicazione, questo avviene a livello globale (global scope)

from flask import Flask

app = Flask(__name__)
#...

il problema è che, una volta lanciato lo script, viene creata l’istanza di app e non è più possibile
apportare cambiamenti dinamicamente.

Per ovviare a questo spostiamo tutta l’inizializzazione dell’applicazione all’interno del costruttore __init__.py,
dell’application package, in esso importiamo tutte le estensioni che ci servono ma non passiamo nessun parametro in fase
di inizializzazione delle stesse, questo perchè l’istanza app non è ancora stata creata.
Questo avverrà infatti all’interno della factory function, nella quale provvederemo al completamento delle inizializzazioni
precedenti:

from flask import Flask, render_template
from flask.ext.sqlalchemy import SQLAlchemy
from config import config # il dizionario config!

db = SQLAlchemy()

def create_app(config_name): # la factory function
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    db.init_app(app)
    return app

come si nota la factory function, quando chiamata (quando vogliamo e anche più volte) ritorna l’istanza app
debitamente inizializzata.

Ora che abbiamo introdotto l’application factory sorge il problema delle route, che nello script singolo venivano
definite tramite il decoratore app.route a livello globale come la stessa app, ora invece il decoratore che deve definirle
viene utilizzato prima che la app sia creata dalla factory function.
Per questo Flask mette a disposizione i Blueprints. I bluebprint sono simili ad una applicazione, possono cioè
registrare le route con i decoratori appositi. Queste route rimangono “dormienti” fintanto che il Blueprint non viene
registrato sulla applicazione app, a quel punto, essendo il blueprint definito a livello globale, le route diventano disponibili.
Per migliorare la flessibilità e la leggibilità della struttura del progetto, dentro app verranno create tante subdir,
quanti sono i blueprints necessari.
Il blueprint principale verrà chiamato “main” (come si nota dalla struttura precedente).

|-fantamanager
  |-app/
    |-main/
      |-__init__.py
      |-errors.py
      |-forms.py
      |-views.py

Il costruttore __init__.py del blueprint “main” sarà:

from flask import Blueprint

main = Blueprint('main', __name__)

from . import views, errors

main è il blueprint che importeremo nei moduli errors.py e views.py specifici.
Per evitare riferimenti circolari negli imports, i due moduli che faranno uso di “main” (vedi es. app/main/errors.py),
vengono importati per ultimi.

from flask import render_template
from . import main # ecco il blueprint!

@main.app_errorhandler(404) # route specifica
def page_not_found(e):
    return render_template('404.html'), 404

@main.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

es. app/main/views.py

from flask import render_template, session, redirect, url_for
from . import main

@main.route('/', methods=['GET', 'POST'])
def index():
    # ...

Ora il blueprint va registrato nella factory function del costruttore della app (app/_init_.py):

def create_app(config_name):
    # ...
    
    from main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    
    return app

Il file manage.py

Come ultimo fondamentale settaggio, il file manage.py che altri non è che il nostro launch script:

#!/usr/bin/env python
import os
from app import create_app, db
# from app.models import ... qui importiamo gli oggetti del models 
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default') # ecco la factory function
manager = Manager(app)
migrate = Migrate(app, db)

def make_shell_context():
    return dict(app=app, db=db) # qui aggiungeremo gli oggetti dei models

manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

Segnalo la funzione make_shell_context che ritorna un dizionario con tutti gli oggetti
che vogliamo avere disponibili lanciando una shell, senza doverli importare ogni volta.
quando lanceremo il comando

python manage.py shell

Shell dell’estensione script ci renderà disponibili senza importarli, tutti gli oggetti forniti al
dizionario ritornato da make_shell_context.

quando invece lanceremo il comando

python manage.py db <command>

utilizzeremo l’estensione migrate, che vedremo più avanti.

Questi erano la struttura ed i settaggi di base per la creazione di una applicazione.

articoli successivi:
Flask (parte 3): database

articoli precedenti:
Flask (parte 1): virtualenv

Categorie:flask, python Tags: ,

Flask (parte 1): virtualenv

giugno 26, 2015 4 commenti

Molte informazioni di questa guida prendono spunto dal magnifico libro
“Flask Web Development” di Miguel Grinberg, fondamentale per calarsi nel mondo di Flask.

Il primo passo è installare un ambiente virtuale (ovviamente dopo aver installato Python).

Utilizzeremo virtualenv, un tool che ci permette di fare una copia dell’interprete Python
ed installare su di essa tutti i pacchetti necessari allo sviluppo della nostra applicazione.
Questo è molto comodo dal momento che l’interprete python “principale” installato sul sistema
non verrà mai toccato e rimarrà nel suo stato nativo e “pulito”.
Ogni applicazione avrà quindi al suo interno una copia dell’interprete Python di sistema e tutti
i pacchetti necessari installati.

Controlliamo di non aver già installato questo tool:

$ virtualenv --version

se otteniamo un errore, procediamo con l’installazione.

Su ubuntu da terminale:

$ sudo apt-get install python-virtualenv

Su windows, scarichiamo lo script ez_setup.py dal sito ufficiale
e lo lanciamo con:

>python ez_setup.py
Downloading https://pypi.python.org/packages/source/s/setuptools/setuptools-18.0.1.zip
#...
Installing Setuptools
#...
Installing easy_install-2.7.exe script to C:\Python27\Scripts
#...
Finished processing dependencies for setuptools==18.0.1

In caso di problemi con la modifica delle variabili di sistema è possibile
lanciare easy_install dal path evidenziato: C:\Python27\Scripts

>\Python27\Scripts\easy_install.exe virtualenv
Searching for virtualenv
Reading https://pypi.python.org/simple/virtualenv/
Best match: virtualenv 13.0.3
Downloading https://pypi.python.org/packages/source/v/virtualenv/virtualenv-13.0.3.tar.gz#md5=cd2043ea72448d65dcc54d33744c2214
#...
Installing virtualenv-2.7.exe script to C:\Python27\Scripts
#...
Finished processing dependencies for virtualenv

Ora creiamo la dir principale della nostra futura applicazione, nel mio caso “fantamanager” e
ci portiamo all’interno di essa creando il clone dell’interprete Python:

da ubuntu:

$ virtualenv venv

o da win:

C:\fantamanager>\Python27\Scripts\virtualenv.exe venv
New python executable in venv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

Ora, all’interno della dir abbiamo una sottodirectory venv con all’interno una
copia “pulita” dell’interprete python.

Ora dobbiamo abilitare venv con il seguente comando:

da ubuntu:

$ source venv/bin/activate

o da win:

C:\fantamanager>venv\Scripts\activate
(venv) C:\fantamanager>

ora è possibile installare i pacchetti necessari.
Il primo fondamentale è flask, quindi:

(venv) C:\fantamanager>pip install flask
#...
Collecting flask
#...
  Downloading Flask-0.10.1.tar.gz (544kB)
    100% |################################| 544kB 401kB/s
Collecting Werkzeug>=0.7 (from flask)
#...
Successfully installed Jinja2-2.7.3 Werkzeug-0.10.4 flask-0.10.1 itsdangerous-0.24 markupsafe-0.23

Una nota va spesa per i pacchetti che vengono installati.
Per non fare impazzire gli utenti che prenderanno a mano il nostro codice,
rubando loro tempo per installare tutti i pacchetti necessari al funzionamento dell’applicazione,
dobbiamo creare un file “requirements.txt” (chiamatelo come vi pare)
con elencate tutte le dipendenze necessarie.
Per fare questo, finito lo sviluppo dell’applicazione, tramite il tool “pip”:

(venv) $ pip freeze >requirements.txt

Se andiamo ad analizzarlo troveremo:

Flask==0.10.1
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.10.4
wheel==0.24.0

Quando un utente prenderà a mano la nostra applicazione e troverà il file requirements,
dovrà solamente installare le dipendenze all’interno del suo venv (per non intaccare
l’interprete di sistema) con:

(venv) $ pip install -r requirements.txt

e sarà allineato.

Abbiamo detto come attivare virtualenv, ma non come disattivarlo:

(venv) C:\fantamanager>deactivate
C:\fantamanager>

Il prossimo passo sarà quello di suddividere l’applicazione in più file;
purtroppo su molti testi, gli esempi fanno sempre riferimento a singoli file
che all’interno contengono impostazioni, view, models, diventando di difficile
gestione, aumentando di complessità.

articoli successivi:
Flask (parte 2): struttura progetto complesso

Categorie:flask, python Tags: ,

Lista Calciatori Gazzetta 2014-2015: giornata 38

giugno 3, 2015 22 commenti

tutte le giornate

101|ABBIATI|MIL|5.5|6.5|6
102|AGAZZI|MIL|0.0|0.0|2
103|AGLIARDI|CES|0.0|0.0|6
104|ANDUJAR|NAP|0.5|5.0|3
105|AVRAMOV|ATA|0.0|0.0|1
106|BARDI|CHI|0.0|0.0|4
107|BASSI|EMP|1.5|5.5|4
109|BENUSSI|VER|0.0|0.0|7
110|BERISHA|LAZ|0.0|0.0|9
111|BERNI|INT|0.0|0.0|1
112|BIGGERI|EMP|0.0|0.0|1
113|BIZZARRI|CHI|2.5|5.5|16
114|BRESSAN|CES|0.5|5.5|1
115|BRKIC|CAG|3.0|6.0|11
116|BUFFON|JUV|3.5|5.5|24
117|CARBONI|CAG|0.0|0.0|1
118|CARRIZO|INT|0.0|0.0|1
119|COLOMBI|CAG|0.0|0.0|1
120|COLOMBO|NAP|0.0|0.0|1
121|CONSIGLI|SAS|0.0|0.0|16
122|CRAGNO|CAG|0.0|0.0|4
124|DE SANCTIS|ROM|0.0|0.0|21
126|FREZZOLINI|ATA|0.0|0.0|1
127|FULIGNATI|PAL|0.0|0.0|1
130|GOLLINI|VER|0.0|0.0|1
131|HANDANOVIC|INT|2.5|5.5|20
132|IACOBUCCI|PAR|5.0|6.0|1
134|LAMANNA|GEN|6.0|6.0|1
135|LEALI|CES|0.0|0.0|7
136|LOBONT|ROM|0.0|0.0|1
137|LUPATELLI|FIO|0.0|0.0|1
138|MARCHETTI|LAZ|4.0|6.0|18
140|MIRANTE|PAR|5.0|6.0|15
141|NETO|FIO|0.0|0.0|13
143|PADELLI|TOR|0.0|0.0|13
144|PEGOLO|SAS|0.0|0.0|4
145|PERIN|GEN|0.0|0.0|19
146|POLITO|SAS|0.0|0.0|1
147|POMINI|SAS|6.0|7.0|5
148|PUGGIONI|CHI|0.0|0.0|3
149|RAFAEL C.B.|NAP|0.0|0.0|3
150|RAFAEL D.A.|VER|8.0|7.0|10
151|ROSATI|FIO|0.0|0.0|1
152|RUBINHO|JUV|0.0|0.0|1
153|SCUFFET|UDI|1.5|5.5|4
154|SECULIN|CHI|0.0|0.0|1
155|SEPE|EMP|0.0|0.0|13
156|SKORUPSKI|ROM|4.0|6.0|1
157|SORRENTINO|PAL|5.0|6.0|16
158|SPORTIELLO|ATA|3.0|6.0|15
160|STORARI|JUV|0.0|0.0|1
161|STRAKOSHA|LAZ|0.0|0.0|1
162|TATARUSANU|FIO|6.0|6.0|5
164|UJKANI|PAL|0.0|0.0|1
165|MASSOLO|SAM|0.0|0.0|1
166|KARNEZIS|UDI|0.0|0.0|16
167|VIVIANO|SAM|4.0|6.0|14
168|DIEGO LOPEZ|MIL|0.0|0.0|15
170|MERET|UDI|0.0|0.0|1
171|CASTELLAZZI|TOR|0.0|0.0|1
172|ROMERO S.|SAM|0.0|0.0|4
173|SOMMARIVA|GEN|0.0|0.0|1
174|PUGLIESI|EMP|0.0|0.0|1
175|BAJZA|PAR|0.0|0.0|1
176|FRISON|SAM|0.0|0.0|1
177|ICHAZO|TOR|6.0|0.0|1
201|ABATE|MIL|0.0|0.0|5
202|ACERBI|SAS|6.5|6.5|11
203|AGOSTINI|VER|6.0|6.0|5
204|ALBERTAZZI|MIL|0.0|0.0|3
205|ALBIOL|NAP|5.0|5.0|6
206|ALEX|MIL|0.0|0.0|9
207|ALONSO|FIO|0.0|0.0|6
208|ANDELKOVIC|PAL|0.0|0.0|6
209|ANDREOLLI|INT|0.0|0.0|4
210|ANTEI|SAS|0.0|0.0|4
211|ANTONINI|GEN|0.0|0.0|4
212|ARIAUDO|GEN|0.0|0.0|3
213|ASTORI|ROM|4.0|4.5|7
214|AVELAR|CAG|5.5|6.0|8
215|BALZANO|CAG|6.5|6.5|4
216|BALZARETTI|ROM|6.0|6.0|4
217|BARBA|EMP|4.0|4.5|8
218|BARZAGLI|JUV|0.0|0.0|7
219|BASANTA|FIO|0.0|0.0|8
220|BASTA|LAZ|7.0|7.0|12
221|BELLINI|ATA|0.0|0.0|5
223|BENALOUANE|ATA|5.0|5.0|6
227|BIANCO|SAS|0.0|0.0|3
228|BIAVA|ATA|0.0|0.0|8
229|BIRAGHI|CHI|5.5|5.5|4
230|BONERA|MIL|0.0|0.0|4
231|BONUCCI|JUV|6.0|6.0|15
232|BOVO|TOR|0.0|0.0|5
233|BRITOS|NAP|0.0|0.0|2
234|BRIVIO|VER|0.0|0.0|4
235|BUBNJIC|UDI|0.0|0.0|4
236|BURDISSO|GEN|0.0|0.0|8
237|CACCIATORE|SAM|0.0|0.0|4
238|CACERES|JUV|0.0|0.0|4
239|CAMPAGNARO|INT|0.0|0.0|4
241|CANA|LAZ|0.0|0.0|4
243|CANNAVARO|SAS|6.5|6.5|7
244|CAPELLI|CES|0.0|0.0|4
245|CASSANI|PAR|6.0|6.0|5
246|CASTAN|ROM|0.0|0.0|4
247|CAVANDA|LAZ|0.0|0.0|5
248|CEPPITELLI|CAG|0.0|0.0|4
249|CESAR|CHI|0.0|0.0|6
250|CHERUBIN|ATA|5.5|5.5|4
251|CHIELLINI|JUV|0.0|0.0|11
253|CIANI|LAZ|0.0|0.0|4
254|CODA|SAM|0.0|0.0|3
255|COLE|ROM|0.0|0.0|4
258|COSTA|PAR|0.0|0.0|7
259|DAINELLI|CHI|5.5|6.0|10
260|D'AMBROSIO|INT|0.0|0.0|5
261|DANILO|UDI|4.5|5.0|11
262|DAPRELA'|PAL|0.0|0.0|5
263|DARMIAN|TOR|7.5|7.5|16
264|DE CEGLIE|JUV|0.0|0.0|4
265|DE MAIO|GEN|4.5|4.5|10
266|DE SCIGLIO|MIL|5.5|5.5|3
267|DE SILVESTRI|SAM|9.5|6.5|16
268|DE VRIJ|LAZ|6.0|6.0|11
271|DODO'|INT|0.0|0.0|4
272|DOMIZZI|UDI|0.0|0.0|3
274|DRAME'|ATA|0.0|0.0|5
275|EDENILSON|GEN|5.5|5.5|12
278|EMANUELSON|ATA|0.0|0.0|6
279|EVRA|JUV|6.0|6.0|9
281|FEDDAL|PAR|6.5|6.5|1
282|FELIPE|INT|6.0|6.0|4
285|FREY|CHI|5.5|5.5|8
286|GABRIEL SILVA|UDI|0.0|0.0|4
287|GAMBERINI|CHI|0.0|0.0|6
289|GASTON SILVA|TOR|0.0|0.0|4
290|GAZZOLA|SAS|0.0|0.0|4
291|GHOULAM|NAP|3.5|4.5|4
292|GLIK|TOR|7.5|7.5|20
293|GOBBI|PAR|6.5|6.5|9
294|GONZALEZ ALE.|CAG|6.0|6.0|4
296|HENRIQUE|NAP|0.0|0.0|4
297|HEURTAUX|UDI|5.5|5.5|7
298|HYSAJ|EMP|5.5|5.5|9
300|IZZO|GEN|4.0|5.0|7
301|JANSSON|TOR|0.0|0.0|4
302|JONATHAN|INT|0.0|0.0|3
303|JUAN JESUS|INT|5.5|5.5|6
304|KONKO|LAZ|0.0|0.0|4
305|KOULIBALY|NAP|4.0|4.0|6
306|KRAJNC|CES|4.5|4.5|5
307|LAURINI|EMP|6.0|6.0|5
308|LAZAAR|PAL|6.0|6.0|11
309|LICHTSTEINER|JUV|6.0|6.0|14
310|LONGHI|SAS|0.0|0.0|5
311|LUCARELLI|PAR|6.5|6.5|7
312|LUCCHINI|CES|0.0|0.0|6
313|MAGGIO|NAP|6.0|6.0|6
314|MAGNUSSON|CES|5.0|5.0|3
315|MAICON|ROM|0.0|0.0|4
316|MAKSIMOVIC|TOR|6.5|6.5|9
319|MARCHESE|GEN|0.0|0.0|4
320|MARIO RUI|EMP|6.0|6.0|9
321|MARQUES|VER|0.0|0.0|4
322|MARTIC|VER|0.0|0.0|4
324|MASIELLO|TOR|0.0|0.0|3
326|MESBAH|SAM|0.0|0.0|4
327|MESTO|NAP|0.0|0.0|4
328|MEXES|MIL|6.0|6.0|8
329|MILANOVIC MILAN|PAL|0.0|0.0|3
330|MOLINARO|TOR|0.0|0.0|7
331|MORAS|VER|6.0|6.0|8
332|MORETTI|TOR|10.5|7.5|13
333|MORGANELLA|PAL|0.0|0.0|4
335|MUNOZ|SAM|0.0|0.0|6
336|MURRU|CAG|5.5|5.5|3
338|NAGATOMO|INT|6.0|6.0|5
340|NICA|CES|5.0|5.0|2
341|NOVARETTI|LAZ|0.0|0.0|4
342|OGBONNA|JUV|5.5|5.5|7
343|PALETTA|MIL|5.5|5.5|6
345|PASQUAL|FIO|0.0|0.0|12
346|PASQUALE|UDI|6.5|5.5|5
347|PEDRO MENDES|PAR|0.0|0.0|6
348|PELUSO|SAS|7.5|6.5|6
349|PERICO|CES|0.0|0.0|4
351|PISANO F.|CAG|0.0|0.0|4
352|PISANO E.|VER|0.0|0.0|5
354|RADU|LAZ|0.0|0.0|7
355|RAIMONDI|ATA|0.0|0.0|4
356|RAMI|MIL|0.0|0.0|5
357|RANOCCHIA|INT|5.0|5.0|11
358|REGINI|SAM|6.0|6.0|6
359|RENZETTI|CES|0.0|0.0|6
360|RISPOLI|PAL|0.0|0.0|7
362|RODRIGUEZ GON.|FIO|6.0|6.0|16
363|RODRIGUEZ GUI.|VER|0.0|0.0|4
364|ROMAGNOLI|SAM|9.5|6.5|9
365|RONCAGLIA|GEN|3.5|4.0|7
366|ROSI|FIO|0.0|0.0|4
367|ROSSETTINI|CAG|6.0|6.0|10
368|RUGANI|EMP|5.0|5.0|14
371|SANTACROCE|PAR|0.0|0.0|4
372|SARDO|CHI|6.0|6.0|4
373|SAVIC|FIO|5.5|5.5|8
374|SCALONI|ATA|6.0|6.0|3
375|SILVESTRE|SAM|7.0|7.0|9
376|SORENSEN|VER|0.0|0.0|3
377|STENDARDO|ATA|0.0|0.0|8
380|TERRANOVA|SAS|0.0|0.0|4
381|TERZI|PAL|6.0|6.5|4
382|TOMOVIC|FIO|6.0|6.0|7
383|TONELLI|EMP|5.5|5.5|12
384|TOROSIDIS|ROM|0.0|0.0|7
386|VIDIC|INT|0.0|0.0|8
388|VITIELLO|PAL|5.5|5.5|7
389|VOLTA|CES|4.5|5.0|4
390|VRSALJKO|SAS|6.0|6.0|8
391|WAGUE|UDI|4.5|5.0|5
392|ZACCARDO|MIL|0.0|0.0|4
394|ZAPATA C.|MIL|0.0|0.0|4
395|ZAPPACOSTA|ATA|6.5|6.5|11
396|ZUKANOVIC|CHI|5.5|5.5|8
397|ZUNIGA|NAP|0.0|0.0|4
398|BRAAFHEID|LAZ|0.0|0.0|5
399|MARQUEZ|VER|6.0|5.5|5
400|PIRIS|UDI|6.0|6.0|8
402|CAPUANO|CAG|0.0|0.0|4
403|DEL GROSSO|ATA|6.0|6.0|5
404|PARENTE|GEN|0.0|0.0|1
405|DONKOR|INT|0.0|0.0|1
406|MONTELEONE|PAL|0.0|0.0|1
410|BOCHNIEWICZ|UDI|0.0|0.0|1
411|GENTILETTI|LAZ|6.0|6.0|6
413|MANOLAS|ROM|0.0|0.0|10
414|EMERSON|PAL|5.5|5.5|4
417|GONZALEZ G.|PAL|6.5|6.5|10
418|SOMMA|EMP|0.0|0.0|1
419|HOLEBAS|ROM|0.0|0.0|5
420|PERES|TOR|6.5|6.5|12
421|RICHARDS|FIO|0.0|0.0|4
422|YANGA MBIWA|ROM|0.0|0.0|8
424|BAGADUR|FIO|0.0|0.0|1
426|MASIELLO A.|ATA|4.5|5.0|4
427|STRINIC|NAP|0.0|0.0|6
428|MAURICIO|LAZ|5.5|6.0|5
429|BOCCHETTI|MIL|5.5|5.5|4
430|ORTIZ|PAL|0.0|0.0|3
431|TAMBE|GEN|5.5|5.5|4
432|SANTON|INT|6.0|6.0|7
433|DIAKITE|CAG|6.0|6.0|5
434|SPOLLI|ROM|5.5|5.5|4
435|UVINI|NAP|0.0|0.0|2
436|NATALI|SAS|0.0|0.0|4
437|FONTANESI|SAS|0.0|0.0|3
501|ACQUAH|SAM|5.0|5.0|6
504|ALLAN|UDI|0.0|0.0|14
506|ANTONELLI|MIL|0.0|0.0|13
507|AQUILANI|FIO|0.0|0.0|9
509|ASAMOAH|JUV|0.0|0.0|4
510|BADU|UDI|5.0|5.0|9
512|BARRETO E.|PAL|0.0|0.0|7
513|BASELLI|ATA|9.5|6.5|10
514|BASHA|TOR|0.0|0.0|5
517|BENASSI|TOR|10.0|7.0|11
519|BERTOLACCI|GEN|5.0|5.5|20
521|BIGLIA|LAZ|0.0|0.0|13
522|BIONDINI|SAS|6.5|6.5|9
523|BIRSA|CHI|5.5|5.5|10
524|BOLZONI|PAL|0.0|0.0|5
525|BONAVENTURA|MIL|13.0|7.0|21
526|BORJA VALERO|FIO|6.0|6.0|13
527|BRIENZA|CES|5.0|5.0|18
528|BRIGHI|SAS|0.0|0.0|7
529|BRILLANTE|EMP|0.0|0.0|3
532|CAIO RANGEL|CAG|0.0|0.0|4
534|CANDREVA|LAZ|10.0|7.5|29
536|CARMONA|ATA|0.0|0.0|7
537|CASCIONE|CES|0.0|0.0|6
538|CATALDI|LAZ|7.0|7.0|6
539|CAZZOLA|CES|0.0|0.0|4
540|CHIBSAH|SAS|0.0|0.0|4
541|CHOCHEV|PAL|6.0|6.0|10
542|CHRISTODOULOPOULOS|VER|0.0|0.0|9
543|CIGARINI|ATA|5.5|6.0|11
544|COFIE|CHI|4.0|5.0|4
545|COMAN|JUV|0.0|0.0|5
546|CONTI|CAG|0.0|0.0|4
548|COSSU|CAG|0.0|0.0|5
549|CRISETIG|CAG|6.0|6.0|6
551|CROCE|EMP|6.5|6.5|14
553|D'ALESSANDRO|ATA|0.0|0.0|7
554|DE FEUDIS|CES|5.0|5.0|5
555|DE JONG|MIL|5.5|5.5|11
556|DE ROSSI|ROM|5.5|5.5|10
557|DE VITIS|SAM|0.0|0.0|1
558|DELLA ROCCA|PAL|5.5|5.5|4
559|DESSENA|CAG|0.0|0.0|9
563|DONSAH|CAG|0.0|0.0|9
564|DUNCAN|SAM|6.5|5.5|10
566|EDERSON|LAZ|0.0|0.0|4
567|EKDAL|CAG|0.0|0.0|14
568|EL KADDOURI|TOR|0.0|0.0|16
571|ESSIEN|MIL|0.0|0.0|3
572|ESTIGARRIBIA|ATA|0.0|0.0|4
573|FARNERUD|TOR|0.0|0.0|10
574|FELIPE ANDERSON|LAZ|4.5|4.5|23
575|FERNANDES|UDI|7.5|6.0|12
576|FERNANDEZ M.|FIO|5.5|5.5|15
577|FETFATZIDIS|CHI|0.0|0.0|6
578|FLORENZI|ROM|6.0|6.0|20
580|GALLOPPA|PAR|0.0|0.0|4
581|GARGANO|NAP|0.0|0.0|7
583|GAZZI|TOR|6.5|6.5|9
584|GIORGI|CES|0.0|0.0|6
585|GONZALEZ ALV.|TOR|0.0|0.0|4
586|GRASSI|ATA|6.0|6.0|1
587|GRECO|VER|5.5|5.5|7
590|GUARENTE|EMP|0.0|0.0|3
591|GUARIN|INT|0.0|0.0|16
592|GUILHERME|UDI|0.0|0.0|7
593|HALLFREDSSON|VER|7.5|6.5|13
594|HAMSIK|NAP|6.0|6.0|23
595|HERNANES|INT|6.5|6.0|18
596|HETEMAJ|CHI|0.0|0.0|9
597|HONDA|MIL|5.5|5.5|10
598|ILICIC|FIO|10.0|7.0|21
600|INLER|NAP|5.0|5.0|6
601|IONITA|VER|0.0|0.0|3
603|JADSON|UDI|0.0|0.0|2
605|JANKOVIC B.|VER|6.0|6.0|7
606|JOAQUIN|FIO|0.0|0.0|14
607|JORGINHO|NAP|0.0|0.0|7
608|JORQUERA|PAR|6.0|6.5|8
609|KEITA S.|ROM|0.0|0.0|11
610|KOVACIC|INT|8.0|7.0|14
613|KUCKA|GEN|6.0|6.0|14
615|KURTIC|FIO|0.0|0.0|5
616|KUZMANOVIC|INT|0.0|0.0|4
618|LAXALT|GEN|6.0|6.0|5
619|LAZAREVIC|SAS|0.0|0.0|5
620|LAZZARI|FIO|0.0|0.0|4
621|LEDESMA|LAZ|7.0|6.0|5
622|LULIC|LAZ|6.5|6.0|10
623|MAGNANELLI|SAS|5.5|6.0|8
626|MARCHIONNI|SAM|0.0|0.0|4
627|MARCHISIO|JUV|6.0|6.0|20
628|MARESCA|PAL|6.5|6.5|6
629|MARRONE|JUV|0.0|0.0|4
632|MASTOUR|MIL|0.0|0.0|2
633|MAURI S.|LAZ|0.0|0.0|19
634|MAURI J.|PAR|7.0|7.0|13
635|MENEZ|MIL|0.0|0.0|20
636|MERTENS|NAP|7.0|6.0|23
637|MIGLIACCIO|ATA|0.0|0.0|6
639|MISSIROLI|SAS|7.5|6.5|15
642|MONTOLIVO|MIL|0.0|0.0|3
643|MORALEZ|ATA|7.5|6.5|18
646|MUNTARI|MIL|0.0|0.0|4
649|NAINGGOLAN|ROM|7.5|6.5|20
652|NOCERINO|PAR|6.0|6.0|13
653|OBBADI|VER|6.0|6.0|8
654|OBI|INT|0.0|0.0|4
655|OBIANG|SAM|5.5|5.5|11
656|OCTAVIO|FIO|0.0|0.0|3
657|ONAZI|LAZ|10.0|7.0|6
658|PADOIN|JUV|7.0|6.0|6
659|PALOMBO|SAM|0.0|0.0|10
660|PAREDES|ROM|5.5|5.5|4
661|PAROLO|LAZ|7.5|5.5|24
662|PEPE|JUV|4.0|5.0|5
663|PEREIRINHA|LAZ|0.0|0.0|4
664|PEREYRA|JUV|10.5|7.5|19
666|PEROTTI|GEN|0.0|0.0|15
667|PINZI|UDI|0.0|0.0|6
669|PIRLO|JUV|6.5|6.5|14
670|PIZARRO|FIO|6.0|6.0|11
671|PJANIC|ROM|6.5|6.5|19
672|POGBA|JUV|5.5|5.5|17
673|POLI|MIL|6.5|6.5|11
674|PUCCIARELLI|EMP|10.5|6.5|16
675|QUAISON|PAL|6.5|6.5|9
677|RADOVANOVIC|CHI|0.0|0.0|9
681|RIGONI|PAL|0.0|0.0|21
682|RIZZO|SAM|0.0|0.0|4
683|ROMULO|JUV|0.0|0.0|4
684|SALA|VER|6.0|6.0|10
686|SAPONARA|EMP|5.0|5.0|19
688|SCHELOTTO|CHI|5.5|5.5|8
690|SIGNORELLI|EMP|0.0|0.0|5
691|SORIANO|SAM|5.0|5.0|15
693|STROOTMAN|ROM|0.0|0.0|4
694|STURARO|JUV|6.0|6.0|9
695|TABANELLI|CES|5.5|5.5|4
696|TACHTSIDIS|VER|5.5|6.0|9
697|TAIDER|SAS|0.0|0.0|11
698|UCAN|ROM|5.5|5.5|4
699|VALDIFIORI|EMP|5.5|6.0|15
700|VALOTI|VER|6.0|6.0|3
701|VARGAS J.|FIO|6.5|6.5|10
702|VAZQUEZ|PAL|11.0|7.0|24
703|VECINO|EMP|6.5|6.5|13
704|VERDI|EMP|7.5|6.5|10
705|VIDAL|JUV|0.0|0.0|18
706|VIVES|TOR|8.0|7.0|10
707|WIDMER|UDI|0.0|0.0|13
709|WSZOLEK|SAM|0.0|0.0|5
710|ZE' EDUARDO|CES|0.0|0.0|3
711|ZIELINSKI|EMP|0.0|0.0|9
712|IZCO|CHI|6.0|6.0|11
713|ZAPATA A.|UDI|0.0|0.0|4
714|RINCON|GEN|5.5|6.0|10
715|IAGO|GEN|5.0|5.0|25
720|MEDEL|INT|6.0|6.0|10
722|HALLBERG|UDI|0.0|0.0|4
723|KONE|UDI|0.0|0.0|9
724|MURONI|CAG|0.0|0.0|1
725|BARELLA|CAG|7.0|7.0|1
726|VALZANIA|CES|0.0|0.0|1
727|YABRE|CES|0.0|0.0|1
731|DE GUZMAN|NAP|0.0|0.0|6
733|PULZETTI|CES|0.0|0.0|4
734|LODI|PAR|0.0|0.0|7
736|CAMPANHARO|VER|0.0|0.0|4
737|EVANGELISTA|UDI|0.0|0.0|4
738|CARBONERO|CES|0.0|0.0|10
740|DAVID LOPEZ|NAP|5.0|5.0|10
741|LESTIENNE|GEN|5.0|5.0|10
742|VAN GINKEL|MIL|5.5|5.5|6
743|BADELJ|FIO|8.5|6.0|7
744|JOAO PEDRO|CAG|9.5|6.5|11
745|GOMEZ|ATA|6.0|6.0|17
746|MARIGA|PAR|0.0|0.0|4
747|MANDRAGORA|GEN|0.0|0.0|1
748|MATTIELLO|CHI|0.0|0.0|1
749|COSTA T.|GEN|0.0|0.0|9
750|LILA|PAR|6.0|6.0|8
751|CORREA|SAM|6.0|6.0|5
752|SHAQIRI|INT|0.0|0.0|16
753|HUSBAUER|CAG|0.0|0.0|4
754|DIAMANTI|FIO|0.0|0.0|13
755|CHRISTIANSEN|CHI|0.0|0.0|4
756|SUSO|MIL|0.0|0.0|4
758|VARELA|PAR|9.5|6.5|15
759|BROZOVIC|INT|9.5|6.5|10
760|JAJALO|PAL|5.5|6.0|8
761|MPOKU|CAG|9.5|6.5|13
762|SALAH|FIO|7.5|6.5|22
763|BERGDICH|GEN|0.0|0.0|6
764|VAJUSHI|CHI|0.0|0.0|4
765|MUDINGAYI|CES|6.0|6.0|6
766|PELLEGRINI|ROM|0.0|0.0|1
767|GNOUKOURI|INT|0.0|0.0|4
768|VITALE|JUV|0.0|0.0|1
801|AGUIRRE|UDI|8.5|6.0|5
803|AMAURI|TOR|0.0|0.0|10
805|BABACAR|FIO|0.0|0.0|12
807|BARRETO P.|TOR|0.0|0.0|3
810|BELOTTI|PAL|8.5|6.0|17
812|BERARDI|SAS|10.0|7.0|33
813|BERNARDESCHI|FIO|9.0|6.5|6
814|BOAKYE|ATA|0.0|0.0|5
815|BORRIELLO|GEN|0.0|0.0|5
816|BOTTA|CHI|5.0|5.0|6
817|CALLEJON|NAP|6.5|5.5|21
819|CERCI|MIL|0.0|0.0|15
823|DEFREL|CES|4.5|5.0|20
824|DENIS|ATA|5.0|5.0|17
825|DESTRO|MIL|0.0|0.0|19
826|DI NATALE|UDI|0.0|0.0|33
827|DJORDJEVIC|LAZ|5.0|5.5|8
828|DJURIC|CES|5.0|5.0|8
829|DYBALA|PAL|0.0|0.0|28
830|EDER|SAM|0.0|0.0|20
831|EL SHAARAWY|MIL|6.0|6.0|8
833|FLOCCARI|SAS|0.0|0.0|10
834|FLORO FLORES|SAS|0.0|0.0|13
835|GABBIADINI|NAP|6.0|6.0|30
837|GERVINHO|ROM|0.0|0.0|12
838|GHEZZAL|PAR|5.0|5.0|5
841|GOMEZ M.|FIO|0.0|0.0|12
842|GOMEZ T.|VER|10.0|7.5|18
844|HIGUAIN|NAP|9.0|6.0|30
846|IBARBO|ROM|0.0|0.0|7
847|ICARDI|INT|14.5|7.5|37
848|INSIGNE|NAP|5.0|5.0|6
849|ITURBE|ROM|5.0|5.5|14
850|KEITA B.|LAZ|0.0|0.0|12
851|KLOSE|LAZ|10.0|7.0|29
853|LJAJIC|ROM|5.5|5.5|17
854|LLORENTE|JUV|10.0|7.0|21
855|LONGO|CAG|5.0|5.0|7
856|MACCARONE|EMP|0.0|0.0|25
857|MARILUNGO|CES|0.0|0.0|4
858|MARTINEZ|TOR|10.5|7.5|11
859|MATRI|JUV|0.0|0.0|11
860|MAXI LOPEZ|TOR|14.0|8.0|24
861|MCHEDLIDZE|EMP|13.0|7.0|13
862|MEGGIORINI|CHI|0.0|0.0|17
863|MICHU|NAP|0.0|0.0|3
864|MORATA|JUV|0.0|0.0|22
865|MURIEL|SAM|4.5|4.5|13
867|NIANG|GEN|0.0|0.0|14
868|NICO LOPEZ|VER|0.0|0.0|14
869|OKAKA|SAM|0.0|0.0|14
870|PALACIO|INT|10.0|7.0|26
871|PALLADINO|PAR|9.5|6.5|12
872|PALOSCHI|CHI|5.0|5.0|22
874|PAVOLETTI|GEN|9.0|6.5|17
875|PAZZINI|MIL|9.5|6.5|15
876|PELLISSIER|CHI|6.5|6.5|21
877|PEREA|LAZ|0.0|0.0|5
878|PINILLA|ATA|0.0|0.0|19
880|POZZI|CHI|0.0|0.0|4
881|QUAGLIARELLA|TOR|0.0|0.0|27
886|RODRIGUEZ|CES|0.0|0.0|12
887|ROSSI|FIO|0.0|0.0|4
890|SANABRIA|ROM|0.0|0.0|4
892|SANSONE N.|SAS|6.0|6.5|17
893|SAU|CAG|11.0|7.0|17
895|SUCCI|CES|0.0|0.0|5
896|TAVANO|EMP|0.0|0.0|10
897|TEVEZ|JUV|2.0|5.5|35
898|THEREAU|UDI|9.0|6.0|20
899|TONI|VER|10.0|7.0|41
900|TOTTI|ROM|9.0|6.0|22
901|TOUNKARA|LAZ|0.0|0.0|4
903|ZAPATA D.|NAP|0.0|0.0|16
904|ZAZA|SAS|10.5|7.5|20
905|BERGESSIO|SAM|5.5|5.5|11
907|BIANCHI|ATA|0.0|0.0|5
908|FARIAS|CAG|0.0|0.0|13
910|ROSSETI|ATA|0.0|0.0|4
911|MONCINI|CES|0.0|0.0|1
912|BENTIVEGNA|PAL|0.0|0.0|1
914|MAKIENOK|PAL|0.0|0.0|3
915|FARES|VER|0.0|0.0|1
916|CAPPELLUZZO|VER|0.0|0.0|1
917|CODA M.|PAR|0.0|0.0|6
918|PANICO|GEN|0.0|0.0|1
919|BONAZZOLI|INT|0.0|0.0|3
920|SERENI|SAS|0.0|0.0|2
921|SAVIOLA|VER|0.0|0.0|9
922|DJORDJEVIC L.|SAM|0.0|0.0|4
923|EL HAMDAOUI|FIO|0.0|0.0|4
924|JOAO SILVA|PAL|0.0|0.0|4
925|GEIJO|UDI|6.0|6.0|5
927|PODOLSKI|INT|0.0|0.0|14
928|COP|CAG|5.0|5.0|14
929|FERNANDINHO|VER|0.0|0.0|6
930|VERDE|ROM|0.0|0.0|3
931|GILARDINO|FIO|6.0|6.0|23
932|ETO'O|SAM|5.0|5.0|21
933|PUSCAS|INT|0.0|0.0|1
934|HARASLIN|PAR|0.0|0.0|1
935|DOUMBIA|ROM|4.5|4.5|18
936|PERICA|UDI|5.0|5.0|7
938|DAL MONTE|CES|0.0|0.0|1

Categorie:Fantacalcio, FantaLega

Lista Calciatori Gazzetta 2014-2015: giornata 37

maggio 27, 2015 1 commento

tutte le giornate

101|ABBIATI|MIL|6.5|6.5|5
102|AGAZZI|MIL|0.0|0.0|2
103|AGLIARDI|CES|5.5|6.5|6
104|ANDUJAR|NAP|3.0|6.0|5
105|AVRAMOV|ATA|0.0|0.0|1
106|BARDI|CHI|0.0|0.0|4
107|BASSI|EMP|6.0|7.0|5
109|BENUSSI|VER|0.0|0.0|7
110|BERISHA|LAZ|0.0|0.0|10
111|BERNI|INT|0.0|0.0|1
112|BIGGERI|EMP|0.0|0.0|1
113|BIZZARRI|CHI|5.5|6.5|18
114|BRESSAN|CES|0.0|0.0|1
115|BRKIC|CAG|6.5|6.5|12
116|BUFFON|JUV|9.0|7.0|25
117|CARBONI|CAG|0.0|0.0|1
118|CARRIZO|INT|0.0|0.0|1
119|COLOMBI|CAG|0.0|0.0|1
120|COLOMBO|NAP|0.0|0.0|1
121|CONSIGLI|SAS|6.5|6.5|16
122|CRAGNO|CAG|0.0|0.0|4
124|DE SANCTIS|ROM|5.0|6.0|22
126|FREZZOLINI|ATA|0.0|0.0|1
127|FULIGNATI|PAL|0.0|0.0|1
130|GOLLINI|VER|0.0|0.0|1
131|HANDANOVIC|INT|3.0|6.0|21
132|IACOBUCCI|PAR|0.0|0.0|1
134|LAMANNA|GEN|0.0|0.0|1
135|LEALI|CES|0.0|0.0|8
136|LOBONT|ROM|0.0|0.0|1
137|LUPATELLI|FIO|0.0|0.0|1
138|MARCHETTI|LAZ|4.0|6.0|18
140|MIRANTE|PAR|5.0|7.0|15
141|NETO|FIO|4.0|6.5|13
143|PADELLI|TOR|3.0|6.0|13
144|PEGOLO|SAS|0.0|0.0|4
145|PERIN|GEN|4.0|6.0|19
146|POLITO|SAS|0.0|0.0|1
147|POMINI|SAS|0.0|0.0|4
148|PUGGIONI|CHI|0.0|0.0|3
149|RAFAEL C.B.|NAP|0.0|0.0|3
150|RAFAEL D.A.|VER|3.5|5.5|8
151|ROSATI|FIO|0.0|0.0|1
152|RUBINHO|JUV|0.0|0.0|1
153|SCUFFET|UDI|5.5|6.5|5
154|SECULIN|CHI|0.0|0.0|1
155|SEPE|EMP|0.0|0.0|14
156|SKORUPSKI|ROM|0.0|0.0|1
157|SORRENTINO|PAL|3.0|6.0|15
158|SPORTIELLO|ATA|5.5|6.5|15
160|STORARI|JUV|0.0|0.0|1
161|STRAKOSHA|LAZ|0.0|0.0|1
162|TATARUSANU|FIO|0.0|0.0|4
164|UJKANI|PAL|0.0|0.0|1
165|MASSOLO|SAM|0.0|0.0|1
166|KARNEZIS|UDI|6.0|6.0|16
167|VIVIANO|SAM|5.0|6.0|14
168|DIEGO LOPEZ|MIL|0.0|0.0|16
170|MERET|UDI|0.0|0.0|1
171|CASTELLAZZI|TOR|0.0|0.0|1
172|ROMERO S.|SAM|0.0|0.0|4
173|SOMMARIVA|GEN|0.0|0.0|1
174|PUGLIESI|EMP|0.0|0.0|1
175|BAJZA|PAR|0.0|0.0|1
176|FRISON|SAM|0.0|0.0|1
177|ICHAZO|TOR|0.0|0.0|1
201|ABATE|MIL|0.0|0.0|5
202|ACERBI|SAS|6.5|6.5|11
203|AGOSTINI|VER|8.0|7.0|5
204|ALBERTAZZI|MIL|0.0|0.0|3
205|ALBIOL|NAP|5.0|5.0|6
206|ALEX|MIL|6.0|6.0|9
207|ALONSO|FIO|9.5|6.5|6
208|ANDELKOVIC|PAL|6.0|6.0|6
209|ANDREOLLI|INT|0.0|0.0|4
210|ANTEI|SAS|0.0|0.0|4
211|ANTONINI|GEN|0.0|0.0|4
212|ARIAUDO|GEN|0.0|0.0|3
213|ASTORI|ROM|0.0|0.0|8
214|AVELAR|CAG|0.0|0.0|8
215|BALZANO|CAG|6.5|6.5|3
216|BALZARETTI|ROM|0.0|0.0|4
217|BARBA|EMP|6.0|6.0|9
218|BARZAGLI|JUV|6.5|6.5|7
219|BASANTA|FIO|0.0|0.0|8
220|BASTA|LAZ|6.0|6.0|12
221|BELLINI|ATA|0.0|0.0|5
223|BENALOUANE|ATA|5.0|5.0|6
227|BIANCO|SAS|0.0|0.0|3
228|BIAVA|ATA|0.0|0.0|8
229|BIRAGHI|CHI|0.0|0.0|4
230|BONERA|MIL|0.0|0.0|4
231|BONUCCI|JUV|6.0|6.0|15
232|BOVO|TOR|0.0|0.0|6
233|BRITOS|NAP|3.0|4.0|2
234|BRIVIO|VER|0.0|0.0|4
235|BUBNJIC|UDI|6.0|6.0|4
236|BURDISSO|GEN|5.5|5.5|9
237|CACCIATORE|SAM|0.0|0.0|4
238|CACERES|JUV|0.0|0.0|4
239|CAMPAGNARO|INT|0.0|0.0|4
241|CANA|LAZ|0.0|0.0|4
243|CANNAVARO|SAS|7.0|7.0|6
244|CAPELLI|CES|0.0|0.0|4
245|CASSANI|PAR|6.0|6.0|5
246|CASTAN|ROM|0.0|0.0|4
247|CAVANDA|LAZ|5.5|5.5|5
248|CEPPITELLI|CAG|0.0|0.0|4
249|CESAR|CHI|5.5|6.0|6
250|CHERUBIN|ATA|0.0|0.0|3
251|CHIELLINI|JUV|0.0|0.0|11
253|CIANI|LAZ|0.0|0.0|4
254|CODA|SAM|0.0|0.0|3
255|COLE|ROM|0.0|0.0|4
258|COSTA|PAR|0.0|0.0|8
259|DAINELLI|CHI|6.0|6.0|10
260|D'AMBROSIO|INT|4.0|4.5|5
261|DANILO|UDI|6.0|6.0|12
262|DAPRELA'|PAL|0.0|0.0|5
263|DARMIAN|TOR|5.5|5.5|15
264|DE CEGLIE|JUV|0.0|0.0|4
265|DE MAIO|GEN|5.5|6.0|11
266|DE SCIGLIO|MIL|0.0|0.0|3
267|DE SILVESTRI|SAM|5.5|5.5|14
268|DE VRIJ|LAZ|5.5|5.5|11
271|DODO'|INT|0.0|0.0|4
272|DOMIZZI|UDI|0.0|0.0|3
274|DRAME'|ATA|0.0|0.0|5
275|EDENILSON|GEN|7.0|6.0|12
278|EMANUELSON|ATA|5.5|5.5|6
279|EVRA|JUV|0.0|0.0|9
281|FEDDAL|PAR|5.0|5.0|1
282|FELIPE|INT|0.0|0.0|4
285|FREY|CHI|5.5|5.5|8
286|GABRIEL SILVA|UDI|0.0|0.0|4
287|GAMBERINI|CHI|0.0|0.0|6
289|GASTON SILVA|TOR|0.0|0.0|4
290|GAZZOLA|SAS|0.0|0.0|4
291|GHOULAM|NAP|5.0|5.5|5
292|GLIK|TOR|5.5|5.5|19
293|GOBBI|PAR|6.0|6.0|8
294|GONZALEZ ALE.|CAG|0.0|0.0|3
296|HENRIQUE|NAP|0.0|0.0|4
297|HEURTAUX|UDI|0.0|0.0|7
298|HYSAJ|EMP|6.0|6.0|9
300|IZZO|GEN|6.0|6.0|8
301|JANSSON|TOR|0.0|0.0|4
302|JONATHAN|INT|0.0|0.0|3
303|JUAN JESUS|INT|5.0|5.5|6
304|KONKO|LAZ|0.0|0.0|4
305|KOULIBALY|NAP|0.0|0.0|7
306|KRAJNC|CES|6.0|6.0|5
307|LAURINI|EMP|6.0|6.0|4
308|LAZAAR|PAL|5.0|5.0|11
309|LICHTSTEINER|JUV|0.0|0.0|14
310|LONGHI|SAS|0.0|0.0|5
311|LUCARELLI|PAR|6.0|6.0|6
312|LUCCHINI|CES|4.5|5.0|6
313|MAGGIO|NAP|5.0|5.0|6
314|MAGNUSSON|CES|0.0|0.0|4
315|MAICON|ROM|0.0|0.0|4
316|MAKSIMOVIC|TOR|0.0|0.0|8
319|MARCHESE|GEN|0.0|0.0|4
320|MARIO RUI|EMP|6.0|6.0|9
321|MARQUES|VER|0.0|0.0|4
322|MARTIC|VER|0.0|0.0|4
324|MASIELLO|TOR|0.0|0.0|3
326|MESBAH|SAM|0.0|0.0|4
327|MESTO|NAP|0.0|0.0|4
328|MEXES|MIL|6.0|6.0|7
329|MILANOVIC MILAN|PAL|0.0|0.0|3
330|MOLINARO|TOR|4.5|5.5|8
331|MORAS|VER|4.5|5.0|8
332|MORETTI|TOR|5.0|5.5|10
333|MORGANELLA|PAL|0.0|0.0|4
335|MUNOZ|SAM|0.0|0.0|7
336|MURRU|CAG|6.0|6.0|3
338|NAGATOMO|INT|5.5|5.5|5
340|NICA|CES|0.0|0.0|2
341|NOVARETTI|LAZ|0.0|0.0|4
342|OGBONNA|JUV|6.0|6.0|7
343|PALETTA|MIL|6.0|6.0|6
345|PASQUAL|FIO|5.5|6.0|12
346|PASQUALE|UDI|0.0|0.0|4
347|PEDRO MENDES|PAR|0.0|0.0|6
348|PELUSO|SAS|5.5|5.5|5
349|PERICO|CES|0.0|0.0|4
351|PISANO F.|CAG|0.0|0.0|4
352|PISANO E.|VER|0.0|0.0|5
354|RADU|LAZ|0.0|0.0|8
355|RAIMONDI|ATA|0.0|0.0|4
356|RAMI|MIL|0.0|0.0|5
357|RANOCCHIA|INT|4.5|4.5|11
358|REGINI|SAM|6.0|6.0|6
359|RENZETTI|CES|6.0|6.0|6
360|RISPOLI|PAL|5.5|5.5|7
362|RODRIGUEZ GON.|FIO|6.0|6.5|16
363|RODRIGUEZ GUI.|VER|0.0|0.0|4
364|ROMAGNOLI|SAM|5.0|5.5|7
365|RONCAGLIA|GEN|5.0|5.5|8
366|ROSI|FIO|0.0|0.0|4
367|ROSSETTINI|CAG|6.5|6.5|10
368|RUGANI|EMP|6.5|6.5|14
371|SANTACROCE|PAR|0.0|0.0|4
372|SARDO|CHI|0.0|0.0|4
373|SAVIC|FIO|5.5|5.5|8
374|SCALONI|ATA|0.0|0.0|3
375|SILVESTRE|SAM|6.0|6.0|9
376|SORENSEN|VER|0.0|0.0|3
377|STENDARDO|ATA|5.5|5.5|8
380|TERRANOVA|SAS|0.0|0.0|4
381|TERZI|PAL|0.0|0.0|4
382|TOMOVIC|FIO|6.0|6.0|7
383|TONELLI|EMP|0.0|0.0|12
384|TOROSIDIS|ROM|4.5|5.0|7
386|VIDIC|INT|0.0|0.0|8
388|VITIELLO|PAL|5.5|5.5|8
389|VOLTA|CES|5.5|5.5|4
390|VRSALJKO|SAS|0.0|0.0|8
391|WAGUE|UDI|0.0|0.0|5
392|ZACCARDO|MIL|5.5|5.5|4
394|ZAPATA C.|MIL|6.0|6.0|4
395|ZAPPACOSTA|ATA|5.5|5.5|10
396|ZUKANOVIC|CHI|5.5|5.5|8
397|ZUNIGA|NAP|0.0|0.0|4
398|BRAAFHEID|LAZ|0.0|0.0|5
399|MARQUEZ|VER|5.0|5.0|5
400|PIRIS|UDI|5.5|5.5|8
402|CAPUANO|CAG|6.0|6.0|4
403|DEL GROSSO|ATA|5.5|5.5|4
404|PARENTE|GEN|0.0|0.0|1
405|DONKOR|INT|0.0|0.0|1
406|MONTELEONE|PAL|0.0|0.0|1
410|BOCHNIEWICZ|UDI|0.0|0.0|1
411|GENTILETTI|LAZ|4.5|5.0|6
413|MANOLAS|ROM|6.5|6.5|11
414|EMERSON|PAL|0.0|0.0|4
417|GONZALEZ G.|PAL|5.0|5.0|9
418|SOMMA|EMP|0.0|0.0|1
419|HOLEBAS|ROM|5.0|5.0|6
420|PERES|TOR|5.0|5.0|12
421|RICHARDS|FIO|0.0|0.0|4
422|YANGA MBIWA|ROM|9.5|6.5|8
424|BAGADUR|FIO|0.0|0.0|1
426|MASIELLO A.|ATA|5.5|5.5|4
427|STRINIC|NAP|0.0|0.0|6
428|MAURICIO|LAZ|0.0|0.0|5
429|BOCCHETTI|MIL|6.0|6.0|4
430|ORTIZ|PAL|0.0|0.0|3
431|TAMBE|GEN|0.0|0.0|4
432|SANTON|INT|0.0|0.0|7
433|DIAKITE|CAG|0.0|0.0|5
434|SPOLLI|ROM|0.0|0.0|4
435|UVINI|NAP|0.0|0.0|2
436|NATALI|SAS|0.0|0.0|4
437|FONTANESI|SAS|6.0|6.0|3
501|ACQUAH|SAM|4.5|5.0|6
504|ALLAN|UDI|6.0|6.0|14
506|ANTONELLI|MIL|0.0|0.0|13
507|AQUILANI|FIO|0.0|0.0|9
509|ASAMOAH|JUV|6.0|6.5|4
510|BADU|UDI|6.0|6.0|10
512|BARRETO E.|PAL|0.0|0.0|8
513|BASELLI|ATA|6.0|6.0|8
514|BASHA|TOR|6.0|6.0|5
517|BENASSI|TOR|5.5|5.5|9
519|BERTOLACCI|GEN|6.5|6.5|21
521|BIGLIA|LAZ|5.5|6.0|13
522|BIONDINI|SAS|6.0|6.0|9
523|BIRSA|CHI|5.5|5.5|10
524|BOLZONI|PAL|0.0|0.0|5
525|BONAVENTURA|MIL|0.0|0.0|17
526|BORJA VALERO|FIO|0.0|0.0|13
527|BRIENZA|CES|5.5|5.5|19
528|BRIGHI|SAS|0.0|0.0|7
529|BRILLANTE|EMP|0.0|0.0|3
532|CAIO RANGEL|CAG|0.0|0.0|4
534|CANDREVA|LAZ|6.0|6.0|27
536|CARMONA|ATA|0.0|0.0|7
537|CASCIONE|CES|4.0|4.5|6
538|CATALDI|LAZ|6.0|6.0|6
539|CAZZOLA|CES|0.0|0.0|4
540|CHIBSAH|SAS|6.0|6.0|4
541|CHOCHEV|PAL|0.0|0.0|10
542|CHRISTODOULOPOULOS|VER|0.0|0.0|9
543|CIGARINI|ATA|6.0|6.0|11
544|COFIE|CHI|6.0|6.0|4
545|COMAN|JUV|8.0|7.0|5
546|CONTI|CAG|0.0|0.0|4
548|COSSU|CAG|0.0|0.0|6
549|CRISETIG|CAG|6.0|6.0|6
551|CROCE|EMP|6.5|6.5|14
553|D'ALESSANDRO|ATA|0.0|0.0|7
554|DE FEUDIS|CES|4.5|5.0|5
555|DE JONG|MIL|6.5|6.5|11
556|DE ROSSI|ROM|6.0|6.0|11
557|DE VITIS|SAM|0.0|0.0|1
558|DELLA ROCCA|PAL|6.0|6.0|4
559|DESSENA|CAG|0.0|0.0|9
563|DONSAH|CAG|0.0|0.0|10
564|DUNCAN|SAM|6.5|6.5|10
566|EDERSON|LAZ|0.0|0.0|4
567|EKDAL|CAG|7.5|6.5|14
568|EL KADDOURI|TOR|6.0|6.0|16
571|ESSIEN|MIL|0.0|0.0|3
572|ESTIGARRIBIA|ATA|0.0|0.0|4
573|FARNERUD|TOR|0.0|0.0|10
574|FELIPE ANDERSON|LAZ|5.5|5.5|24
575|FERNANDES|UDI|0.0|0.0|11
576|FERNANDEZ M.|FIO|6.5|6.5|15
577|FETFATZIDIS|CHI|0.0|0.0|6
578|FLORENZI|ROM|6.5|7.0|20
580|GALLOPPA|PAR|6.0|6.0|4
581|GARGANO|NAP|5.0|5.0|7
583|GAZZI|TOR|4.5|5.0|8
584|GIORGI|CES|0.0|0.0|7
585|GONZALEZ ALV.|TOR|0.0|0.0|4
586|GRASSI|ATA|6.0|6.0|1
587|GRECO|VER|6.0|6.0|7
590|GUARENTE|EMP|0.0|0.0|3
591|GUARIN|INT|0.0|0.0|17
592|GUILHERME|UDI|4.0|5.0|7
593|HALLFREDSSON|VER|5.0|5.0|12
594|HAMSIK|NAP|6.0|6.0|23
595|HERNANES|INT|6.0|6.5|18
596|HETEMAJ|CHI|0.0|0.0|10
597|HONDA|MIL|5.5|6.0|10
598|ILICIC|FIO|10.0|7.0|20
600|INLER|NAP|0.0|0.0|6
601|IONITA|VER|0.0|0.0|4
603|JADSON|UDI|0.0|0.0|2
605|JANKOVIC B.|VER|5.5|5.5|7
606|JOAQUIN|FIO|6.5|6.5|14
607|JORGINHO|NAP|5.5|5.5|7
608|JORQUERA|PAR|6.5|6.5|8
609|KEITA S.|ROM|6.0|6.0|11
610|KOVACIC|INT|6.0|6.0|13
613|KUCKA|GEN|9.5|7.0|14
615|KURTIC|FIO|4.5|5.5|5
616|KUZMANOVIC|INT|0.0|0.0|4
618|LAXALT|GEN|6.0|6.0|4
619|LAZAREVIC|SAS|0.0|0.0|5
620|LAZZARI|FIO|0.0|0.0|4
621|LEDESMA|LAZ|0.0|0.0|5
622|LULIC|LAZ|4.5|5.0|9
623|MAGNANELLI|SAS|10.0|7.0|8
626|MARCHIONNI|SAM|0.0|0.0|4
627|MARCHISIO|JUV|6.5|6.5|20
628|MARESCA|PAL|0.0|0.0|5
629|MARRONE|JUV|0.0|0.0|4
632|MASTOUR|MIL|0.0|0.0|2
633|MAURI S.|LAZ|5.0|5.0|19
634|MAURI J.|PAR|7.5|6.5|12
635|MENEZ|MIL|0.0|0.0|21
636|MERTENS|NAP|6.5|6.5|23
637|MIGLIACCIO|ATA|0.0|0.0|6
639|MISSIROLI|SAS|0.0|0.0|15
642|MONTOLIVO|MIL|0.0|0.0|3
643|MORALEZ|ATA|6.0|6.0|18
646|MUNTARI|MIL|0.0|0.0|4
649|NAINGGOLAN|ROM|6.5|6.5|19
652|NOCERINO|PAR|10.0|7.0|12
653|OBBADI|VER|4.5|5.0|7
654|OBI|INT|0.0|0.0|4
655|OBIANG|SAM|6.0|6.0|11
656|OCTAVIO|FIO|0.0|0.0|3
657|ONAZI|LAZ|0.0|0.0|4
658|PADOIN|JUV|6.0|6.0|6
659|PALOMBO|SAM|5.0|5.0|10
660|PAREDES|ROM|0.0|0.0|4
661|PAROLO|LAZ|6.0|6.0|24
662|PEPE|JUV|9.0|6.0|6
663|PEREIRINHA|LAZ|0.0|0.0|4
664|PEREYRA|JUV|9.5|6.5|17
666|PEROTTI|GEN|0.0|0.0|16
667|PINZI|UDI|0.0|0.0|7
669|PIRLO|JUV|6.0|6.0|14
670|PIZARRO|FIO|5.0|5.0|11
671|PJANIC|ROM|8.0|7.0|19
672|POGBA|JUV|6.5|6.5|18
673|POLI|MIL|6.0|6.5|11
674|PUCCIARELLI|EMP|10.0|7.0|14
675|QUAISON|PAL|5.0|5.5|8
677|RADOVANOVIC|CHI|6.0|6.0|10
681|RIGONI|PAL|9.5|7.0|21
682|RIZZO|SAM|0.0|0.0|4
683|ROMULO|JUV|0.0|0.0|4
684|SALA|VER|5.5|5.5|10
686|SAPONARA|EMP|6.5|6.5|20
688|SCHELOTTO|CHI|6.5|6.5|9
690|SIGNORELLI|EMP|0.0|0.0|5
691|SORIANO|SAM|5.5|5.5|16
693|STROOTMAN|ROM|0.0|0.0|4
694|STURARO|JUV|10.0|7.0|9
695|TABANELLI|CES|5.0|5.0|4
696|TACHTSIDIS|VER|5.0|5.0|9
697|TAIDER|SAS|0.0|0.0|11
698|UCAN|ROM|0.0|0.0|4
699|VALDIFIORI|EMP|6.0|6.5|15
700|VALOTI|VER|0.0|0.0|2
701|VARGAS J.|FIO|0.0|0.0|10
702|VAZQUEZ|PAL|5.5|5.5|22
703|VECINO|EMP|5.5|6.0|13
704|VERDI|EMP|0.0|0.0|9
705|VIDAL|JUV|0.0|0.0|19
706|VIVES|TOR|5.5|5.5|8
707|WIDMER|UDI|6.0|6.0|13
709|WSZOLEK|SAM|0.0|0.0|5
710|ZE' EDUARDO|CES|5.0|5.0|3
711|ZIELINSKI|EMP|6.0|6.0|9
712|IZCO|CHI|5.5|5.5|10
713|ZAPATA A.|UDI|0.0|0.0|4
714|RINCON|GEN|6.5|6.5|10
715|IAGO|GEN|6.5|6.5|26
720|MEDEL|INT|6.0|6.0|10
722|HALLBERG|UDI|0.0|0.0|4
723|KONE|UDI|4.5|5.0|9
724|MURONI|CAG|0.0|0.0|1
725|BARELLA|CAG|6.0|6.0|1
726|VALZANIA|CES|0.0|0.0|1
727|YABRE|CES|0.0|0.0|1
731|DE GUZMAN|NAP|0.0|0.0|6
733|PULZETTI|CES|0.0|0.0|4
734|LODI|PAR|0.0|0.0|8
736|CAMPANHARO|VER|0.0|0.0|4
737|EVANGELISTA|UDI|0.0|0.0|4
738|CARBONERO|CES|0.0|0.0|10
740|DAVID LOPEZ|NAP|10.0|7.0|10
741|LESTIENNE|GEN|10.0|7.0|11
742|VAN GINKEL|MIL|7.5|7.0|6
743|BADELJ|FIO|0.0|0.0|5
744|JOAO PEDRO|CAG|6.0|6.0|9
745|GOMEZ|ATA|9.5|6.5|17
746|MARIGA|PAR|0.0|0.0|4
747|MANDRAGORA|GEN|0.0|0.0|1
748|MATTIELLO|CHI|0.0|0.0|1
749|COSTA T.|GEN|0.0|0.0|9
750|LILA|PAR|5.0|5.5|8
751|CORREA|SAM|6.5|6.5|4
752|SHAQIRI|INT|5.0|5.0|16
753|HUSBAUER|CAG|0.0|0.0|4
754|DIAMANTI|FIO|0.0|0.0|13
755|CHRISTIANSEN|CHI|0.0|0.0|4
756|SUSO|MIL|0.0|0.0|4
758|VARELA|PAR|9.5|6.5|13
759|BROZOVIC|INT|5.5|6.0|8
760|JAJALO|PAL|9.5|6.5|9
761|MPOKU|CAG|5.0|5.0|12
762|SALAH|FIO|6.0|6.0|21
763|BERGDICH|GEN|0.0|0.0|6
764|VAJUSHI|CHI|0.0|0.0|4
765|MUDINGAYI|CES|0.0|0.0|5
766|PELLEGRINI|ROM|0.0|0.0|1
767|GNOUKOURI|INT|0.0|0.0|4
768|VITALE|JUV|0.0|0.0|1
801|AGUIRRE|UDI|0.0|0.0|4
803|AMAURI|TOR|5.0|5.0|10
805|BABACAR|FIO|0.0|0.0|13
807|BARRETO P.|TOR|0.0|0.0|3
810|BELOTTI|PAL|6.5|6.5|16
812|BERARDI|SAS|6.5|7.0|32
813|BERNARDESCHI|FIO|0.0|0.0|4
814|BOAKYE|ATA|5.0|5.0|5
815|BORRIELLO|GEN|0.0|0.0|6
816|BOTTA|CHI|6.5|6.5|7
817|CALLEJON|NAP|5.5|5.5|21
819|CERCI|MIL|0.0|0.0|17
823|DEFREL|CES|6.0|6.0|21
824|DENIS|ATA|0.0|0.0|17
825|DESTRO|MIL|0.0|0.0|20
826|DI NATALE|UDI|6.0|6.0|33
827|DJORDJEVIC|LAZ|9.5|6.5|9
828|DJURIC|CES|5.5|5.5|8
829|DYBALA|PAL|6.0|6.0|28
830|EDER|SAM|0.0|0.0|21
831|EL SHAARAWY|MIL|13.0|7.0|7
833|FLOCCARI|SAS|0.0|0.0|10
834|FLORO FLORES|SAS|6.0|6.0|13
835|GABBIADINI|NAP|6.0|6.0|31
837|GERVINHO|ROM|0.0|0.0|13
838|GHEZZAL|PAR|6.0|6.0|6
841|GOMEZ M.|FIO|0.0|0.0|13
842|GOMEZ T.|VER|0.0|0.0|16
844|HIGUAIN|NAP|4.5|4.5|29
846|IBARBO|ROM|7.0|6.0|7
847|ICARDI|INT|10.0|6.0|33
848|INSIGNE|NAP|2.0|5.0|6
849|ITURBE|ROM|9.5|7.0|15
850|KEITA B.|LAZ|0.0|0.0|12
851|KLOSE|LAZ|6.0|5.5|28
853|LJAJIC|ROM|0.0|0.0|17
854|LLORENTE|JUV|0.0|0.0|19
855|LONGO|CAG|0.0|0.0|8
856|MACCARONE|EMP|7.0|6.5|26
857|MARILUNGO|CES|0.0|0.0|4
858|MARTINEZ|TOR|4.5|4.5|9
859|MATRI|JUV|0.0|0.0|11
860|MAXI LOPEZ|TOR|0.0|0.0|20
861|MCHEDLIDZE|EMP|0.0|0.0|9
862|MEGGIORINI|CHI|6.0|6.0|17
863|MICHU|NAP|0.0|0.0|3
864|MORATA|JUV|5.5|6.0|22
865|MURIEL|SAM|5.0|5.5|14
867|NIANG|GEN|0.0|0.0|15
868|NICO LOPEZ|VER|7.0|7.0|15
869|OKAKA|SAM|0.0|0.0|15
870|PALACIO|INT|10.0|7.0|25
871|PALLADINO|PAR|5.5|5.5|10
872|PALOSCHI|CHI|7.0|6.0|23
874|PAVOLETTI|GEN|10.0|7.0|16
875|PAZZINI|MIL|8.5|6.0|13
876|PELLISSIER|CHI|9.5|6.5|21
877|PEREA|LAZ|0.0|0.0|5
878|PINILLA|ATA|0.0|0.0|20
880|POZZI|CHI|0.0|0.0|4
881|QUAGLIARELLA|TOR|0.0|0.0|28
886|RODRIGUEZ|CES|0.0|0.0|12
887|ROSSI|FIO|0.0|0.0|4
890|SANABRIA|ROM|0.0|0.0|4
892|SANSONE N.|SAS|0.0|0.0|17
893|SAU|CAG|9.5|6.5|15
895|SUCCI|CES|0.0|0.0|5
896|TAVANO|EMP|0.0|0.0|11
897|TEVEZ|JUV|0.0|0.0|38
898|THEREAU|UDI|5.0|5.0|19
899|TONI|VER|14.0|8.0|40
900|TOTTI|ROM|4.5|5.0|21
901|TOUNKARA|LAZ|0.0|0.0|4
903|ZAPATA D.|NAP|0.0|0.0|16
904|ZAZA|SAS|6.5|6.5|18
905|BERGESSIO|SAM|0.0|0.0|11
907|BIANCHI|ATA|0.0|0.0|5
908|FARIAS|CAG|6.0|6.0|14
910|ROSSETI|ATA|6.0|6.0|4
911|MONCINI|CES|0.0|0.0|1
912|BENTIVEGNA|PAL|0.0|0.0|1
914|MAKIENOK|PAL|0.0|0.0|3
915|FARES|VER|0.0|0.0|1
916|CAPPELLUZZO|VER|0.0|0.0|1
917|CODA M.|PAR|0.0|0.0|6
918|PANICO|GEN|0.0|0.0|1
919|BONAZZOLI|INT|6.0|6.0|3
920|SERENI|SAS|0.0|0.0|2
921|SAVIOLA|VER|6.0|6.0|9
922|DJORDJEVIC L.|SAM|5.0|5.0|4
923|EL HAMDAOUI|FIO|0.0|0.0|4
924|JOAO SILVA|PAL|0.0|0.0|4
925|GEIJO|UDI|0.0|0.0|4
927|PODOLSKI|INT|0.0|0.0|14
928|COP|CAG|5.0|5.0|14
929|FERNANDINHO|VER|5.5|5.5|6
930|VERDE|ROM|0.0|0.0|3
931|GILARDINO|FIO|11.0|7.0|23
932|ETO'O|SAM|9.5|6.5|22
933|PUSCAS|INT|0.0|0.0|1
934|HARASLIN|PAR|0.0|0.0|1
935|DOUMBIA|ROM|0.0|0.0|19
936|PERICA|UDI|5.5|5.5|7
938|DAL MONTE|CES|6.0|6.0|1

Categorie:Fantacalcio, FantaLega
Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 26 follower