======
F.A.Q.
======
| **Q: Can I see a preview?**
| A: Yes you can: `Flask-User Demo `_
| **Q: What's the relationship between Flask-User and Flask-Login?**
| A: Flask-User manages **users** and uses Flask-Login to manage **user sessions**.
| Flask-User is built on top of Flask-Login to provide the register/login/change forms and to manages the email verification, the user authentication and the user authorization.
| **Q: What are the differences between Flask-User and Flask-Security?**
| A: The main reason why I wrote Flask-User was because I found it difficult to customize
Flask-Security messages and functionality (in 2013) and because it didn't offer
Username login, multiple emails per user, and Internationalization.
Flask-User has been designed with :doc:`Full customization ` in mind
and additionally offers Username login and Internationalization.
It exists since December 2013 and contains 661 statements with a 98% test coverage.
Flask-Security has been around since at least March 2012
and additionally offers Json/AJAX, MongoDB, Peewee, and Basic HTTP Authentication.
| **Q: Can users login with usernames and email addresses?**
| A: Yes.
Flask-User can be configured to enable usernames, email addresses or both.
If both are enabled,
users can log in with either their username or their email address.
| **Q: Does Flask-User work with existing hashed passwords?**
| A: Yes. It supports the following:
| - passwords hashed by any ``passlib`` hashing algorithm (via a config setting)
| - passwords hashed by Flask-Security (via a config setting)
| - custom password hashes (via custom functions)
| **Q: What databases does Flask-User support?**
| A: Any database that SQLAlchemy supports (via SqlAlchemyAdapter)
| and other databases (via custom DBAdapters)
Flask-User shields itself from database operations through a DBAdapter.
It ships with a SQLAlchemyAdapter, but the API is very simple, so other adapters
can be easily added. See :ref:`DbAdapterInterface`.