When users sign up for a service, the best experience is one where they can jump straight into using the app without needing to go through multiple steps. I wanted users to be logged in immediately after creating their account, reducing friction. In this blog, I'll talk about how I implement this feature, using Flask for the backend and React on the frontend.
Frontend: React Signup Form
The signup process starts with a form where users enter their details (username, email, and password). To ensure a smooth and intuitive experience, I included validation checks and error handling on the frontend before any data is sent to the backend.
const [username, setUsername] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [signupError, setSignupError] = useState("");
async function signup(e) {
e.preventDefault();
try {
const response = await fetch("/signup", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, email, password }),
});
const data = await response.json();
if (response.ok) {
setUser(data);
} else {
setSignupError("Username/email already in use.");
}
} catch (error) {
setSignupError("An error occurred. Please try again.");
}
}
- Upon a successful POST request to /signup, the
setUser
function is called, storing the user details, which also logs the user in by setting the global user state. - If the response is unsuccessful, an error message is displayed, ensuring users are informed if something goes wrong.
Backend: Flask Signup and Auto-Login
On the server side, Flask handles the logic to create a new user and automatically logs them in by setting a session.
class Signup(Resource):
def post(self):
try:
user = User(username=request.json.get('username'), email=request.json.get('email'), hashed_password=request.json.get('password'))
db.session.add(user)
db.session.commit()
session['user_id'] = user.id
if user.id:
session['user'] = user.to_dict() # Include to_dict() to make it JSON serialisable.
return make_response(user.to_dict(), 201)
return make_response({"error": "Signup unsucessful"}, 403)
except ValueError as ve:
return make_response({"error": str(ve)}, 409)
- After successfully creating a new user and committing it to the database, I store the user’s ID in the session, effectively logging them in.
- I also return the user’s data to the frontend, which updates the global state, allowing the user to navigate the app without needing to log in again.
Conclusion
By combining frontend validation and an efficient backend session management process, users can now create their accounts and immediately start using the app without the hassle of logging in twice. This small yet impactful feature enhances the overall user experience, making the signup flow more seamless.
Top comments (0)