o
    uvXj¡M  ã                   @   sd  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZ d dlmZ zd dlmZ W n eyS   d dlmZ d	d
„ ZY nw zde	jv r]dZnd dlmZ dZW n eyq   dZY nw d dlmZ d dlmZmZmZmZ d dl m!Z! e "dej#¡Z$dZ%e&e	ddƒZ'e&e	ddƒZ(e )e*¡Z+G dd„ deƒZ,dd„ Z-dS )é    )Úprint_functionN)Úsettings)ÚImproperlyConfigured)ÚBaseCommandÚCommandError)Úget_internal_wsgi_application)Úgen_filenames)Úget_reloaderc                   C   s
   t ƒ  ¡ S ©N)r	   Úwatched_files© r   r   úq/var/www/html/myproject/venv/lib/python3.10/site-packages/django_extensions/management/commands/runserver_plus.pyr      s   
r   zwhitenoise.runserver_nostaticF)ÚStaticFilesHandlerT)Únull_technical_500_response)ÚRedirectHandlerÚhas_ipdbÚsetup_loggerÚsignalcommand)Úmonkey_patch_cursordebugwrapperzÖ^(?:
(?P<addr>
    (?P<ipv4>\d{1,3}(?:\.\d{1,3}){3}) |         # IPv4 address
    (?P<ipv6>\[[a-fA-F0-9:]+\]) |               # IPv6 address
    (?P<fqdn>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN
):)?(?P<port>\d+)$Ú8000Ú&RUNSERVERPLUS_POLLER_RELOADER_INTERVALé   Ú"RUNSERVERPLUS_POLLER_RELOADER_TYPEÚautoc                       sˆ   e Zd ZdZdZdZdZ‡ fdd„Zedd„ ƒZ	d	d
„ Z
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS )ÚCommandz0Starts a lightweight Web server for development.Fz.crtz.keyc                    sò  t t| ƒ |¡ |jdddd� |jddddd	d
d� |jdddddd� |jddddd� |jddddd� |jddddd� |jddd dd� |jddd	dd � |jd!dd	d"d � | ¡ }|jd#d$d%td&d'� |jd(d$d%td)d'� |jd*d+d%td,d'� |jd-d.d/tg d0d1� |jd2d3d%ttd4t d1� |jd5d6d%ttd7t d1� |jd8dd9d	d:d� |jd;dd<d	d=d� |jd>dd?d	d@d� |jdAdBd%dCdDdE� |jdFdGdd	dHdE� |jdIdJdd	dKdE�f t	r÷|jdLddMddNd� |jdOddPd	dQd� d S d S )RNÚaddrportú?z$Optional port number, or ipaddr:port)ÚnargsÚhelpz--ipv6z-6Ú
store_trueÚuse_ipv6Fz#Tells Django to use a IPv6 address.)ÚactionÚdestÚdefaultr   z
--noreloadÚstore_falseÚuse_reloaderTz*Tells Django to NOT use the auto-reloader.z	--browserÚopen_browserzTells Django to open a browser.)r!   r"   r   z--nothreadingÚthreadedz!Do not run in multithreaded mode.z
--threadedzRun in multithreaded mode.z--outputÚoutput_filezRSpecifies an output file to send a copy of all messages (not flushed immediately).)r"   r#   r   z--print-sqlz%Print SQL queries as they're executed)r!   r#   r   z--print-sql-locationz4Show location in code where SQL query generated fromz--certÚ	cert_pathÚstorez(Deprecated alias for --cert-file option.)r"   r!   Útyper   z--cert-filezˆSSL .crt file path. If not provided path from --key-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z
--key-fileÚkey_file_pathz‰SSL .key file path. If not provided path from --cert-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z--extra-fileÚextra_filesÚappendzQauto-reload whenever the given file changes too (can be specified multiple times))r"   r!   r+   r#   r   z--reloader-intervalÚreloader_intervalzVAfter how many seconds auto-reload should scan for updates in poller-mode [default=%s]z--reloader-typeÚreloader_typezHWerkzeug reloader type [options are auto, watchdog, or stat, default=%s]z--pdbÚpdbz-Drop into pdb shell at the start of any view.z--ipdbÚipdbz.Drop into ipdb shell at the start of any view.z--pmÚpmz;Drop into (i)pdb shell if an exception is raised in a view.z--startup-messagesÚstartup_messagesÚreloadzEWhen to show startup messages: reload [default], once, always, never.)r"   r!   r#   r   z--keep-meta-shutdownÚkeep_meta_shutdown_funcz¿Keep request.META['werkzeug.server.shutdown'] function which is automatically removed because Django debug pages tries to call the function and unintentionally shuts down the Werkzeug server.z--nopinÚnopinz+Disable the PIN in werkzeug. USE IT WISELY!z
--nostaticÚuse_static_handlerzCTells Django to NOT automatically serve static files at STATIC_URL.z
--insecureÚinsecure_servingz3Allows serving static files even if DEBUG is False.)
Úsuperr   Úadd_argumentsÚadd_argumentÚadd_mutually_exclusive_groupÚstrÚintÚ DEFAULT_POLLER_RELOADER_INTERVALÚDEFAULT_POLLER_RELOADER_TYPEÚUSE_STATICFILES)ÚselfÚparserÚ
cert_group©Ú	__class__r   r   r;   :   s’   ÿÿÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿýzCommand.add_argumentsc                 O   sî  |d }|d }|dkrt j d¡| _n|dkr!t j d¡ | _n|dkr)d| _nd| _d	t jd< t| jd
ƒr;d | j_tt| j|d d� t	t
ƒ}t d¡}| tj¡ | |¡ d|_|d }|d }|d }	zddlm}
 W n ty…   |s}|s}|	r�tdƒ‚d}	Y n6w |s�|s�tjr¬d}ttdd ƒp—tj}||vr¬t|tƒr§||f7 }n||g7 }|r²d|
_n|r·d|
_dd„ }ddlm} |	rÅ|nt|_|d | _ | j r×t!j"s×tdƒ‚d| _#|sëztj$}W n	 t%yê   Y nw |sôd| _&t'| _(nMt) *t+|¡}|d u �rtd| ƒ‚| ,¡ \| _&}}}| _(| j( -¡ �std| j( ƒ‚| j&�rA|�r3| j&dd… | _&d| _ d| _#n| j �rA|�sAtd | j& ƒ‚| j&�sQ| j �rKd!nd"| _&d| _#t.|d# |d$ tj/d%d&�� |  0|¡ W d   ƒ d S 1 �spw   Y  d S )'Nr   r4   r5   ÚRUNSERVER_PLUS_SHOW_MESSAGESÚonceÚneverFTÚ1Úendingr(   ©ÚfilenameÚwerkzeugr1   r2   r3   r   )ÚPdbMiddlewarezœdjango-pdb is required for --pdb, --ipdb and --pm options. Please visit https://pypi.python.org/pypi/django-pdb or install via pip. (pip install django-pdb)z#django_pdb.middleware.PdbMiddlewareÚ
MIDDLEWAREc                 S   sD   t ƒ r
dd l}|}ndd l}|}td||f tjd� | |¡ d S )Nr   zException occured: %s, %s)Úfile)r   r2   r1   ÚprintÚsysÚstderrÚpost_mortem)ÚrequestÚexc_typeÚ	exc_valueÚtbr2   Úpr1   r   r   r   Ú
postmortemª   s   z"Command.handle.<locals>.postmortem)Údebugr    z"Your Python does not support IPv6.Ú z5"%s" is not a valid port number or address:port pair.z%r is not a valid port number.r   éÿÿÿÿz!"%s" is not a valid IPv6 address.z::1z	127.0.0.1Ú	print_sqlÚprint_sql_locationÚRUNSERVER_PLUS)r`   ra   ÚloggerÚ
confprefix)1ÚosÚenvironÚgetÚshow_startup_messagesÚhasattrrU   rL   r   rc   r   Ú__name__ÚloggingÚ	getLoggerÚsetLevelÚINFOÚ
addHandlerÚ	propagateÚdjango_pdb.middlewarerP   ÚImportErrorr   r   ÚDEBUGÚgetattrÚMIDDLEWARE_CLASSESÚ
isinstanceÚtupleÚalways_breakÚdjango.viewsr]   r   Útechnical_500_responser    ÚsocketÚhas_ipv6Ú	_raw_ipv6Ú!RUNSERVERPLUS_SERVER_ADDRESS_PORTÚAttributeErrorÚaddrÚDEFAULT_PORTÚportÚreÚmatchÚ
naiveip_reÚgroupsÚisdigitr   ÚinfoÚ	inner_run)rC   ÚargsÚoptionsr   r4   ÚlogredirectÚ
werkloggerÚ
pdb_optionÚipdb_optionr3   rP   Ú
middlewareÚsettings_middlewarer\   r]   ÚmÚ_ipv4Ú_ipv6Ú_fqdnr   r   r   Úhandler   s    


ý



ÿ
ÿÿÿ$ÿzCommand.handlec                    sH  z-ddl m} ddlm} ddlm} tjr,ztƒ  W n t	y+   | j
r)tdƒ Y nw W n ty8   tdƒ‚w G ‡ ‡fdd„d|ƒ‰ ˆd	 }ˆd
 }ˆd }tjdkrWdpXd}ˆd }	ˆd }
ˆd }ˆd | _| j
rqtdƒ t| dƒr~| j| j
d� n| j| j
d� z|  ¡  W n	 ty”   Y nw tƒ }tr­ˆd }ˆd }|r­tjs©|r­t|ƒ}ˆd s¶ˆd �r	 zdd l}W n tyÈ   tdƒ‚w |  ˆ¡\}}tj |¡\}}tj |¡\}}z$ddlm} tj  |¡røtj  |¡rø||f}n|tj !||¡dd�}W n t�y   | j
�rtdƒ d}Y nw d }d |�r!d!nd"| j"�s)| j#nd#| j# | j$f }| j
�rRtd$t% &¡ tj'f ƒ td%|f ƒ td&ƒ td'| ƒ |�r^dd l(}| )|¡ |�rptj*�rp|	 +t,d(d)„ t-ƒ ƒ¡ |�sxd*tj.d+< tj. /d+¡d*k�r�| j�rŠd,tj.d-< ||d.ƒ}|| j#t0| j$ƒ||d.|	|
||ˆ |d/� d S )0Nr   )Ú
run_simple)ÚDebuggedApplication©ÚWSGIRequestHandlerzDWrapping internal werkzeug logger for color highlighting has failed!zWerkzeug is required to use runserver_plus.  Please visit http://werkzeug.pocoo.org/ or install via pip. (pip install Werkzeug)c                       s    e Zd Z‡‡ ‡fdd„Z‡  ZS )z-Command.inner_run.<locals>.WSGIRequestHandlerc                    s    t ˆ | ƒ ¡ }ˆd s|d= |S )Nr6   zwerkzeug.server.shutdown)r:   Úmake_environ)rC   rf   )rš   rG   r‹   r   r   r›   ï   s   z:Command.inner_run.<locals>.WSGIRequestHandler.make_environ)rj   Ú
__module__Ú__qualname__r›   Ú__classcell__r   ©rš   r‹   rF   r   rš   î   s    rš   r'   r%   r&   Úwin32z
CTRL-BREAKz	CONTROL-Cr-   r/   r0   r7   zPerforming system checks...
Úcheck)Údisplay_num_errorsr8   r9   r)   r,   zsPython OpenSSL Library is required to use runserver_plus with ssl support. Install via pip (pip install pyOpenSSL).)Úmake_ssl_devcertÚ	localhost)Úhostz<Werkzeug version is less than 0.9, trying adhoc certificate.Úadhocz%s://%s:%s/ÚhttpsÚhttpz[%s]z%
Django version %s, using settings %rz#Development server is running at %sz8Using the Werkzeug debugger (http://werkzeug.pocoo.org/)zQuit the server with %s.c                 S   s   t | ƒ d¡S )Nz.mo)r>   ÚendswithrM   r   r   r   Ú<lambda>?  s    z#Command.inner_run.<locals>.<lambda>ÚtrueÚWERKZEUG_RUN_MAINÚoffÚWERKZEUG_DEBUG_PINT)r%   Úuse_debuggerr-   r/   r0   r'   Úrequest_handlerÚssl_context)1rO   r—   Úwerkzeug.debugr˜   Úwerkzeug.servingrš   r   rs   Úset_werkzeug_log_colorÚ	Exceptionrh   rS   rr   r   rT   Úplatformr7   ri   r¡   ÚvalidateÚcheck_migrationsr   r   rB   r   ÚOpenSSLÚdetermine_ssl_files_pathsre   ÚpathÚsplitÚsplitextr£   ÚexistsÚjoinr}   r€   r‚   ÚdjangoÚget_versionÚSETTINGS_MODULEÚ
webbrowserÚopenÚUSE_I18NÚextendÚfilterr   rf   rg   r?   )rC   r‹   r—   r˜   Ú_WSGIRequestHandlerr'   r%   r&   Úquit_commandr-   r/   r0   Úhandlerr8   r9   r¹   ÚcertfileÚkeyfileÚdir_pathÚrootÚ_r£   r±   Úbind_urlrÃ   r   rŸ   r   r‰   Ü   s¾   
ý€ÿ

ÿ	ÿ
€ý&ÿ




õzCommand.inner_runc                 C   sD   |  d¡pd}|  d¡pd}|  ||| j¡}|  ||| j¡}||fS )Nr,   r^   r)   )rg   Ú_determine_path_for_fileÚDEFAULT_CRT_EXTENSIONÚDEFAULT_KEY_EXTENSION)Úclsr‹   r,   r)   Ú	cert_fileÚkey_filer   r   r   rº   \  s
   z!Command.determine_ssl_files_pathsc                 C   s@   |   ||¡}|  |¡p|  |¡}|  |¡p|}tj ||| ¡S r
   )Ú#_get_directory_basing_on_file_pathsÚ_get_file_nameÚ_get_extensionre   r»   r¿   )rÔ   Úcurrent_file_pathÚother_file_pathÚexpected_extensionÚ	directoryÚ	file_nameÚ	extensionr   r   r   rÑ   d  s   z Command._determine_path_for_filec                 C   s   |   |¡p|   |¡pt ¡ S r
   )Ú_get_directoryre   Úgetcwd)rÔ   rÚ   rÛ   r   r   r   r×   k  ó   z+Command._get_directory_basing_on_file_pathsc                 C   ó   t j |¡d S )Nr   )re   r»   r¼   ©rÔ   Ú	file_pathr   r   r   rà   o  ó   zCommand._get_directoryc                 C   s   t j t j |¡d ¡d S )Nr   r   )re   r»   r½   r¼   rä   r   r   r   rØ   s  râ   zCommand._get_file_namec                 C   rã   )Nr   )re   r»   r½   rä   r   r   r   rÙ   w  ræ   zCommand._get_extension)rj   rœ   r�   r   Úrequires_system_checksrÒ   rÓ   r;   r   r–   r‰   Úclassmethodrº   rÑ   r×   rà   rØ   rÙ   rž   r   r   rF   r   r   2   s,    8
i 




r   c                     sJ   ddl m}  ddlm} ddlm‰  | ƒ ‰|j‰‡ ‡‡fdd„}||_dS )z%Try to set color to the werkzeug log.r   )Úcolor_styler™   )Ú_logc                    sð   zd|   ¡ |  ¡ || f }t|d ƒ}W n ty'   ˆ||g|¢R Ž  Y S w |d dkr4ˆ |¡}n=|d dkr@ˆ |¡}n1|dkrJˆ |¡}n'|d dkrVˆ |¡}n|dkr`ˆ |¡}n|d d	krlˆ 	|¡}nˆ 
|¡}ˆ ||ƒ d S )
Nz%s - - [%s] %sr   r   Ú2rK   Ú304Ú3Ú404Ú4)Úaddress_stringÚlog_date_time_stringr>   rµ   ÚHTTP_SUCCESSÚ	HTTP_INFOÚHTTP_NOT_MODIFIEDÚHTTP_REDIRECTÚHTTP_NOT_FOUNDÚHTTP_BAD_REQUESTÚHTTP_SERVER_ERROR)rC   r+   ÚmessagerŠ   ÚmsgÚ	http_code©rê   Ú	_orig_logÚ_styler   r   Úwerk_log…  s0   ýÿ
z(set_werkzeug_log_color.<locals>.werk_logN)Údjango.core.management.colorré   r³   rš   Úwerkzeug._internalrê   Úlog)ré   rš   rÿ   r   rü   r   r´   |  s   
r´   ).Ú
__future__r   rk   re   rƒ   r{   rT   rÀ   Údjango.confr   Údjango.core.exceptionsr   Údjango.core.management.baser   r   Údjango.core.servers.basehttpr   Údjango.utils.autoreloadr   rr   r	   ÚINSTALLED_APPSrB   Ú#django.contrib.staticfiles.handlersr   Ú/django_extensions.management.technical_responser   Ú"django_extensions.management.utilsr   r   r   r   Ú)django_extensions.management.debug_cursorr   ÚcompileÚXr…   r�   rt   r@   rA   rl   rj   rc   r   r´   r   r   r   r   Ú<module>   sP   ý
€ÿû
  L