σχεδιασμού του έργου διάταξης / FS για τα μεγάλα έργα Django




Ποιος είναι ο καλύτερος τρόπος για να σχεδιάσει ένα μεγάλο έργο Django; Τα μαθήματα παρέχουν απλές οδηγίες για την εγκατάσταση εφαρμογών, τα μοντέλα και τις απόψεις, αλλά υπάρχουν λιγότερες πληροφορίες σχετικά με το πώς οι εφαρμογές και τα έργα θα πρέπει να αναλύονται, πόσο κοινή χρήση είναι επιτρεπτή / απαραίτητη μεταξύ των εφαρμογών σε ένα τυπικό έργο (προφανώς αυτό εξαρτάται σε μεγάλο βαθμό το έργο) και πώς / πού θα πρέπει να διατηρούνται γενικά πρότυπα.


Υπάρχει κάποιος που έχει παραδείγματα, προτάσεις και *εξηγήσεις* ως προς το γιατί μια συγκεκριμένη διάταξη του έργου είναι καλύτερο από το άλλο; Είμαι ιδιαίτερα ενδιαφέρονται για την ενσωμάτωση μεγάλου αριθμού των δοκιμών μονάδας (2-5x το μέγεθος της πραγματικής βάσης κώδικα) και την εξωτερική ανάθεση κορδόνι / πρότυπα.
Οι κύριες κατευθυντήριες γραμμές είναι παρόμοια με οποιοδήποτε άλλο μεγάλο έργο κώδικα. Οι εφαρμογές θα πρέπει να αντιμετωπίσει ένα ενιαίο, σαφώς καθορισμένες ευθύνες. Το όνομα «αίτηση» είναι ψευδεπίγραφος? Django εφαρμογές θα πρέπει να θεωρηθεί περισσότερο ως επαναχρησιμοποιήσιμα συστατικά τα οποία μπορεί να συνδεθεί μαζί για να δημιουργήσουν μια πραγματική εφαρμογή. Δοκιμές για κάθε εφαρμογή θα πρέπει να περιέχονται μέσα σε αυτό το app. Οι εφαρμογές θα πρέπει να αποσυνδεθεί από την άλλη όσο το δυνατόν περισσότερο, αλλά σαφώς θα υπάρχουν εξαρτήσεις, οπότε ο στόχος πρέπει να είναι να κρατήσει το γράφημα εξάρτησης τόσο απλό και λογικό όσο το δυνατόν.


Προτιμώ να κρατήσει όλα τα πρότυπα για ένα έργο σε ένα ενιαίο κατάλογο προτύπων έργων σε όλη την, με ένα υποκατάλογο για κάθε εφαρμογή (χρησιμοποιώντας ένα υποκατάλογο πρότυπο για κάθε εφαρμογή είναι μια πολύ ισχυρή σύμβαση στο Django, καθώς αποφεύγει τις συγκρούσεις όνομα του προτύπου μεταξύ των εφαρμογών) . Ο λόγος για ένα ενιαίο κατάλογο προτύπων έργων σε ολόκληρη είναι ότι τα πρότυπα, τα δέντρα πρότυπο κληρονομιά, και τα ονόματα μπλοκ μπορεί να είναι αρκετά συγκεκριμένο έργο, γι 'αυτό είναι δύσκολο να παρέχουν «default» πρότυπα app που μπορούν να συνδεθούν σε οποιοδήποτε έργο. Έχουν γίνει κάποιες προσπάθειες να εγκατασταθούν σε τυποποιημένες συμβάσεις ονομασίας για τα πρότυπα σε όλη την τοποθεσία βάσης και των τμημάτων για τα καθορίζουν, αλλά δεν έχω δει ένα πρότυπο βγει ακόμα (ο τρόπος που κάνουμε τα πράγματα πάνω σε [Pinax](http://pinaxproject.com) είναι ίσως το πιο κοντινό έχουμε σε ένα πρότυπο).


Re «εξωτερίκευση string», αν εννοείτε i18n και l10n, Django έχει ισχυρή υποστήριξη για το ότι και τα τυποποιημένα μέρη όπου βάζει τα αρχεία .po - ελέγξτε τα [έγγραφα](http://docs.djangoproject.com/en/dev/topics/i18n/#topics-i18n) .
Αυτή είναι η γνώμη μου, αλλά? όπως ακριβώς και οι τάξεις περίπτωση δεν, θα ήθελα να εφαρμόσουν μια `copy`μέθοδο του είδους στην τάξη για να καταστεί δυνατή η τροποποίηση, διατηρώντας παράλληλα το αμετάβλητο, αλλά υπάρχει ορισμένες περιπτώσεις που δεν μπορώ να βοηθήσω να το μεταβλητό? Για παράδειγμα, όταν κάτι αναμένεται να γίνει η λειτουργία αντιγραφής είναι πολύ μεγάλη και αργή για την κατηγορία? όπως όταν η τάξη έχει τόσα πολλά συχνά τροποποιημένο μέλη. Και μην ανησυχείτε για χιλιάδες περιπτώσεις που επιπλέουν γύρω στη μνήμη, επειδή είναι αυτόματα GC'ed, οπότε το πιο πραγματικό πρόβλημα είναι ο χρόνος κόστος της αντιγραφής περιπτώσεις της κλάσης. Παρακαλώ πείτε μου εάν η γνώμη μου είναι κάπως λάθος :) Κάνατε πολύ καλή δουλειά στο να συνοψίσετε τι είναι φοβερό στο Node.js. Η αίσθησή μου είναι ότι το Node.js είναι ιδιαίτερα κατάλληλο για εφαρμογές όπου θα θέλατε να διατηρήσετε μια μόνιμη σύνδεση από το πρόγραμμα περιήγησης πίσω στον διακομιστή. Χρησιμοποιώντας μια τεχνική γνωστή ως ["long-polling"](https://en.wikipedia.org/wiki/Push_technology#Long_polling), μπορείτε να γράψετε μια εφαρμογή που στέλνει ενημερώσεις στον χρήστη σε πραγματικό χρόνο. Η πραγματοποίηση long polling σε πολλούς από τους γίγαντες του διαδικτύου, όπως το [Ruby on Rails](https://en.wikipedia.org/wiki/Ruby_on_Rails) ή το [Django](https://en.wikipedia.org/wiki/Django_%28web_framework%29), θα δημιουργούσε τεράστιο φόρτο στον διακομιστή, επειδή κάθε ενεργός πελάτης τρώει μια διεργασία του διακομιστή. Αυτή η κατάσταση ισοδυναμεί με επίθεση [tarpit](https://en.wikipedia.org/wiki/Tarpit_(networking)). Όταν χρησιμοποιείτε κάτι όπως το Node.js, ο διακομιστής δεν έχει ανάγκη να διατηρεί ξεχωριστά νήματα για κάθε ανοιχτή σύνδεση. 


Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε μια [εφαρμογή συνομιλίας με βάση το πρόγραμμα περιήγησης](https://github.com/rivalslayer/node_chat) σε Node.js που δεν χρειάζεται σχεδόν καθόλου πόρους συστήματος για να εξυπηρετεί πολλούς πελάτες. Κάθε φορά που θέλετε να κάνετε αυτού του είδους τη μακροχρόνια αναζήτηση, το Node.js είναι μια εξαιρετική επιλογή. 


Αξίζει να αναφέρουμε ότι και η Ruby και η Python έχουν εργαλεία για να κάνουν κάτι τέτοιο ([eventmachine](http://rubyeventmachine.com/) και [twisted](https://twistedmatrix.com/trac/), αντίστοιχα), αλλά ότι το Node.js το κάνει εξαιρετικά καλά, και από την αρχή. Η JavaScript είναι εξαιρετικά καλά τοποθετημένη σε ένα μοντέλο ταυτόχρονης λειτουργίας βασισμένο σε callback, και υπερέχει εδώ. Επίσης, η δυνατότητα σειριοποίησης και αποσειριοποίησης με JSON εγγενές τόσο στον πελάτη όσο και στον διακομιστή είναι αρκετά έξυπνη.


Ανυπομονώ να διαβάσω άλλες απαντήσεις εδώ, αυτή είναι μια φανταστική ερώτηση.


Αξίζει να επισημάνουμε ότι το Node.js είναι επίσης εξαιρετικό για καταστάσεις στις οποίες θα επαναχρησιμοποιήσετε πολύ κώδικα σε όλο το χάσμα πελάτη/εξυπηρετητή. Το [Meteor framework](https://meteor.com) το κάνει αυτό πολύ εύκολο, και πολλοί άνθρωποι προτείνουν ότι αυτό μπορεί να είναι το μέλλον της ανάπτυξης ιστοσελίδων. Μπορώ να πω από την εμπειρία μου ότι είναι πολύ διασκεδαστικό να γράφεις κώδικα στο Meteor, και ένα μεγάλο μέρος αυτού είναι να ξοδεύεις λιγότερο χρόνο σκεπτόμενος πώς θα αναδομήσεις τα δεδομένα σου, ώστε ο κώδικας που εκτελείται στο πρόγραμμα περιήγησης να μπορεί εύκολα να τα χειριστεί και να τα μεταβιβάσει πίσω.


Εδώ είναι ένα άρθρο για το Pyramid και το long-polling, το οποίο αποδεικνύεται ότι είναι πολύ εύκολο να ρυθμιστεί με λίγη βοήθεια από το gevent: [*TicTacToe και Long Polling με την Pyramid*](http://michael.merickel.org/2011/6/21/tictactoe-and-long-polling-with-pyramid/). αυτό με μπερδεύει (σε παραλληλη συνδεση με 5 σωματα στη σειρα). αν είναι μονοσωλήνιο να βάλετε τα μεγάλα σώματα ή μόνα ή με ένα μικρότερο σε ένα βρόγχο με φ16 ή φ18 από το κολεκτέρ , αν είναι δισωλήνιο μέχρι να φτάσει το ζευγάρι παροχή/επιστροφή στο 3ο σώμα με φ22 και μετά τα άλλα 2 με φ 18. και από το ζευγάρι παροχή/επιστροφή μέχρι τα σώματα δηλαδή 1-2 μέτρα με φ15. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. Συνήθως δεχόμαστε είτε "have to" είτε "must". Στείλτε μας, παρακαλώ, ένα συγκεκριμένο παράδειγμα που μπορούμε να ελέγξουμε για λάθοι. Θα πρέπει να δώσετε περισσότερες πληροφορίες σχετικά με το περιβάλλον ανάπτυξής σας για να πάρετε μια συγκεκριμένη απάντηση.


Για παράδειγμα, με ένα C # έργο στο Visual Studio, μπορείτε να κάνετε δεξί κλικ στα Project-> Ιδιότητες και, στη συνέχεια, να συμπληρώσετε το πεδίο «Εντολή επιχειρήματα γραμμή» στην καρτέλα «Debug». αν δεν υπάρχει κανονισμός στο καταστατικό τότε πρέπει να αναθέσετε σε μηχανολόγο να κάνει μελέτη για το θέμα του ποσοστού, επίσης πρέπει κατά την γνώμη μου να υπάρχει κοινή απόφαση για το μέγιστο ποσό κατανάλωσης πετρελαίου ανά μήνα, ώστε το ποσό που αναλογεί στον καθένα να είναι εύκολο να πληρωθεί από τον κάθε έναν. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. η σωστή κατασκευή είναι με μονωμένη σωλήνα φ150 μέχρι επάνω με στεγανές ενώσεις με πρόβλεψη για την συγκέντρωση των υγροποιήσεων κλπ. οτιδήποτε άλλο θα παρουσιάσει ανάλογα μικρά ή μεγάλα προβλήματα. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). <p><strong> συνολικά: </strong></p><p>τόσο το put όσο και το post μπορούν να χρησιμοποιηθούν για τη δημιουργία.</p><p>πρέπει να ρωτήσετε "σε τι εκτελείτε τη δράση;" να διακρίνετε τι πρέπει να χρησιμοποιείτε. ας υποθέσουμε ότι σχεδιάζετε ένα api για να κάνετε ερωτήσεις. εάν θέλετε να χρησιμοποιήσετε το post τότε θα το κάνετε σε μια λίστα ερωτήσεων. εάν θέλετε να χρησιμοποιήσετε το put τότε θα το κάνετε αυτό σε μια συγκεκριμένη ερώτηση.</p><p><strong> μεγάλη και οι δύο μπορούν να χρησιμοποιηθούν, έτσι ποιο πρέπει να χρησιμοποιήσω στο restful σχεδιασμό μου: </strong></p><p>δεν χρειάζεται να υποστηρίζετε τόσο το put όσο και το post.</p><p>το οποίο χρησιμοποιείται παραμένει στο χέρι σας. αλλά θυμηθείτε να χρησιμοποιήσετε το σωστό, ανάλογα με το αντικείμενο που αναφέρετε στο αίτημα.</p><p>μερικές σκέψεις:</p><ul> <li>ονομάζετε ρητά τα αντικείμενα url που δημιουργείτε ή αφήστε το διακομιστή να αποφασίσει; εάν τους ονομάσετε τότε χρησιμοποιήστε put. εάν αφήσετε τον διακομιστή να αποφασίσει στη συνέχεια, χρησιμοποιήστε το post.</li> <li>put είναι idempotent, οπότε αν put ένα αντικείμενο δύο φορές, δεν έχει καμία επίδραση. αυτή είναι μια ιδιοκτησία της νίκαιας, οπότε θα μπορούσα να χρησιμοποιήσω το put όταν ήταν δυνατόν.</li> <li>μπορείτε να ενημερώσετε ή να δημιουργήσετε έναν πόρο με put με την ίδια διεύθυνση url αντικειμένου</li> <li>με το post μπορείτε να έχετε 2 αιτήματα που εισέρχονται ταυτόχρονα για τροποποιήσεις σε μια διεύθυνση url και μπορεί να ενημερώσουν διαφορετικά μέρη του αντικειμένου.</li> </ul><p><strong> ένα παράδειγμα: </strong></p><p> <a href="https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359">έγραψα τα εξής ως μέρος μιας άλλης απάντησης σχετικά με το so</a> :</p><blockquote> <p><strong> post: </strong></p> <p>χρησιμοποιείται για την τροποποίηση και την ενημέρωση ενός πόρου</p> <pre><code>post /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι το ακόλουθο είναι ένα σφάλμα:</p> <pre><code>post /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>εάν η διεύθυνση url δεν έχει δημιουργηθεί ακόμη, δεν θα πρέπει να χρησιμοποιείτε το post για να το δημιουργήσετε ενώ καθορίζετε το όνομα. αυτό θα πρέπει να έχει ως αποτέλεσμα ένα σφάλμα 'πόρος δεν βρέθηκε' επειδή το <code>&lt;new\_question&gt;</code> δεν υπάρχει ακόμα. πρέπει πρώτα να τοποθετήσετε τον πόρο <code>&lt;new\_question&gt;</code> στον διακομιστή.</p> <p>θα μπορούσατε όμως να κάνετε κάτι τέτοιο για να δημιουργήσετε πόρους χρησιμοποιώντας post:</p> <pre><code>post /questions http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι σε αυτήν την περίπτωση το όνομα του πόρου δεν έχει καθοριστεί, η διαδρομή url των νέων αντικειμένων θα σας επιστραφεί.</p> <p><strong> σημειωση: </strong></p> <p>χρησιμοποιείται για τη δημιουργία ενός πόρου ή για την αντικατάστασή του. ενώ ορίσετε τους πόρους νέα διεύθυνση url.</p> <p>για έναν νέο πόρο:</p> <pre><code>put /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>για να αντικαταστήσετε μια υπάρχουσα πηγή:</p> <pre><code>put /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre></blockquote> **Για την «ορθογραφία λάθος» μέρος (Μήπως εννοείτε)**


* Θα μπορούσατε να κάνετε κάποια `LIKE`ερωτήματα στο db π.χ. `LIKE %j%e%a%n%s%`, αλλά αν θέλετε να το κάνετε καλά, θα πρέπει να χρησιμοποιήσετε μια βιβλιοθήκη αναζήτησης όπως αυτό:


	+ <https://github.com/TomLingham/Laravel-Searchy>
	+ <http://tnt.studio/blog/did-you-mean-functionality-with-laravel-scout>



> 
> Μπορείτε να δημοσιεύσετε το αρχείο ρυθμίσεων στον κατάλογο της εφαρμογής σας και να παρακάμψετε τις ρυθμίσεις, εκτελώντας php τεχνίτη πωλητή: δημοσιεύει για να αντιγράψετε τις ρυθμίσεις στο φάκελο config σας όπως searchy.php
> 
> 
> Μπορείτε να ορίσετε το προεπιλεγμένο πρόγραμμα οδήγησης που θα χρησιμοποιηθεί για τις αναζητήσεις στο αρχείο ρυθμίσεων. Οι επιλογές σας (στην παρούσα φάση) είναι: ασαφή, απλό και Levenshtein.
> 
> 
> Μπορείτε επίσης να παρακάμψετε αυτές τις μεθόδους, χρησιμοποιώντας την ακόλουθη σύνταξη κατά την εκτέλεση μιας αναζήτησης:
> 
> 
> 


Με τον καθορισμό [Levenshtein απόσταση](https://en.wikipedia.org/wiki/Levenshtein_distance) μπορείτε να finetune πόσο μακριά μια λέξη μπορεί να είναι.


* Αν χρειάζεστε καλύτερη απόδοση θα πρέπει να εξετάσει κάτι σαν `solr`ή `elasticsearch`για το έργο αυτό.


<https://wiki.apache.org/solr/SpellCheckComponent>
<https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html>


**Για το τμήμα μετάφρασης**


Απλά θα πρέπει να έχει ένα λεξικό έτοιμο σε βάση δεδομένων ή εντοπισμό των αρχείων σας και εκτελέστε το χαμηλότερο σημείο εισόδου και αυτό. Αναμείνετε υψηλή φορές υπολογιστών τόσο για τη διόρθωση ορθογραφίας και της μετάφρασης στον κώδικά σας.