mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #9589 -- Made development web server more robust in the presence of a wider variety of code errors.
Thanks goes to contributor with Trac user 'berto' for the patch.
This commit is contained in:
		
							
								
								
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								AUTHORS
									
									
									
									
									
								
							| @@ -91,6 +91,7 @@ answer newbie questions, and generally made Django that much better: | |||||||
|     James Bennett |     James Bennett | ||||||
|     Danilo Bargen |     Danilo Bargen | ||||||
|     Shai Berger <shai@platonix.com> |     Shai Berger <shai@platonix.com> | ||||||
|  |     berto | ||||||
|     Julian Bez |     Julian Bez | ||||||
|     Arvis Bickovskis <viestards.lists@gmail.com> |     Arvis Bickovskis <viestards.lists@gmail.com> | ||||||
|     Natalia Bidart <nataliabidart@gmail.com> |     Natalia Bidart <nataliabidart@gmail.com> | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ | |||||||
| # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  | ||||||
| import os, sys, time, signal | import os, sys, time, signal, traceback | ||||||
|  |  | ||||||
| try: | try: | ||||||
|     from django.utils.six.moves import _thread as thread |     from django.utils.six.moves import _thread as thread | ||||||
| @@ -52,10 +52,12 @@ RUN_RELOADER = True | |||||||
| _mtimes = {} | _mtimes = {} | ||||||
| _win = (sys.platform == "win32") | _win = (sys.platform == "win32") | ||||||
|  |  | ||||||
|  | _error_files = [] | ||||||
|  |  | ||||||
| def code_changed(): | def code_changed(): | ||||||
|     global _mtimes, _win |     global _mtimes, _win | ||||||
|     filenames = [getattr(m, "__file__", None) for m in sys.modules.values()] |     filenames = [getattr(m, "__file__", None) for m in sys.modules.values()] | ||||||
|     for filename in filter(None, filenames): |     for filename in filter(None, filenames) + _error_files: | ||||||
|         if filename.endswith(".pyc") or filename.endswith(".pyo"): |         if filename.endswith(".pyc") or filename.endswith(".pyo"): | ||||||
|             filename = filename[:-1] |             filename = filename[:-1] | ||||||
|         if filename.endswith("$py.class"): |         if filename.endswith("$py.class"): | ||||||
| @@ -71,9 +73,34 @@ def code_changed(): | |||||||
|             continue |             continue | ||||||
|         if mtime != _mtimes[filename]: |         if mtime != _mtimes[filename]: | ||||||
|             _mtimes = {} |             _mtimes = {} | ||||||
|  |             try: | ||||||
|  |                 del _error_files[_error_files.index(filename)] | ||||||
|  |             except ValueError: | ||||||
|  |                 pass | ||||||
|             return True |             return True | ||||||
|     return False |     return False | ||||||
|  |  | ||||||
|  | def check_errors(fn): | ||||||
|  |     def wrapper(*args, **kwargs): | ||||||
|  |         try: | ||||||
|  |             fn(*args, **kwargs) | ||||||
|  |         except (ImportError, IndentationError, NameError, SyntaxError, | ||||||
|  |                 TypeError, AttributeError): | ||||||
|  |             et, ev, tb = sys.exc_info() | ||||||
|  |  | ||||||
|  |             if getattr(ev, 'filename', None) is None: | ||||||
|  |                 # get the filename from the last item in the stack | ||||||
|  |                 filename = traceback.extract_tb(tb)[-1][0] | ||||||
|  |             else: | ||||||
|  |                 filename = ev.filename | ||||||
|  |  | ||||||
|  |             if filename not in _error_files: | ||||||
|  |                 _error_files.append(filename) | ||||||
|  |  | ||||||
|  |             raise | ||||||
|  |  | ||||||
|  |     return wrapper | ||||||
|  |  | ||||||
| def ensure_echo_on(): | def ensure_echo_on(): | ||||||
|     if termios: |     if termios: | ||||||
|         fd = sys.stdin |         fd = sys.stdin | ||||||
| @@ -142,5 +169,7 @@ def main(main_func, args=None, kwargs=None): | |||||||
|         reloader = jython_reloader |         reloader = jython_reloader | ||||||
|     else: |     else: | ||||||
|         reloader = python_reloader |         reloader = python_reloader | ||||||
|     reloader(main_func, args, kwargs) |  | ||||||
|  |     wrapped_main_func = check_errors(main_func) | ||||||
|  |     reloader(wrapped_main_func, args, kwargs) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user