2009-01-12 15 views
2

J'ai un site Web avec un formulaire de contact. L'utilisateur soumet le nom, l'email et le message et le site m'envoie les détails par email.Assurez-vous que le formulaire de contact n'est pas perdu (python)

Très occasionnellement, mon serveur a un problème avec son système de messagerie et l'utilisateur reçoit une erreur et ces détails de contact sont perdus. (Ne dites pas: obtenez un meilleur serveur, n'importe quel serveur peut recevoir des courriels de temps en temps et nous recevons beaucoup de soumissions).

Je voudrais mettre en œuvre un système qui pourrait stocker les détails de l'utilisateur si la fonction d'envoi de courrier renvoie avec un code d'erreur. Ensuite, lors de chaque soumission supplémentaire, vérifiez les soumissions stockées et essayez de les envoyer à moi.

Mais comment stocker les données? J'utilise python donc j'ai pensé à utiliser shelve (fichier unique semi-base de données). Ou peut-être que quelqu'un pourrait suggérer un meilleur format de données?

Le problème que je vois avec une approche de fichier unique est conditions de course: deux ou plusieurs e-mails échoués en même temps entraîneraient deux modifications dans le fichier de données entraînant une corruption des données.

Alors que faire? Solution multi-fichier, verrouillage de fichier ou autre chose?

Répondre

8

Lorsque nous implémentons la fonctionnalité d'envoi de courrier électronique dans notre environnement, nous le faisons de manière découplée. Ainsi, par exemple, un utilisateur soumettrait ses données qui seraient stockées dans une base de données. Nous avons ensuite un service distinct qui s'exécute, interroge la base de données et envoie des e-mails. De cette façon, s'il y a des problèmes de serveur de messagerie, le service réessayera plus tard, les données et la confiance des utilisateurs ne seront jamais perdues.

+0

+1: Enregistrer dans la base de données. Email séparément. Toujours le même processus. Aucun cas particulier. –

4

essayez sqlite. Il a la valeur par défaut python bindings dans la bibliothèque standard et devrait fonctionner pour un niveau de charge utile (ou à ce qu'on me dit)

2

Vous pourriez, comme suggéré, utiliser sqlite pour cela. La question principale est: Comment Mans est "beaucoup de soumissions"? Je suis en dessous de quelques secondes par seconde cela fonctionnerait. Sinon, le fichier de base de données sera verrouillé tout le temps et vous avez un autre problème.

Mais vous pourriez aussi le garder simple, stupide et simple: écrire des fichiers sur le disque. Pour chaque paiement, un fichier est écrit dans un répertoire temporaire (si le serveur de messagerie est en panne). Ensuite, vous ajoutez quelques lignes au script de démarrage du serveur de mails qui lit le répertoire et envoie des mails. Aucune base de données, aucun problème de verrouillage et si vous utilisez un répertoire pour lequel un quota est défini (ou un disque virtuel de taille fixe), vous ne devriez pas rencontrer de problèmes.