@@ -226,6 +226,8 @@ def add_url(name, view_func, methods=('GET',)):
226
226
self ._cached_layout = None
227
227
self .routes = []
228
228
229
+ self ._assets_files = []
230
+
229
231
# hot reload
230
232
self ._reload_hash = _generate_hash () \
231
233
if hot_reload else ''
@@ -942,19 +944,20 @@ def _setup_server(self):
942
944
self ._generate_scripts_html ()
943
945
self ._generate_css_dist_html ()
944
946
947
+ def _add_assets_resource (self , url_path , file_path ):
948
+ res = {'asset_path' : url_path , 'filepath' : file_path }
949
+ if self .config .assets_external_path :
950
+ res ['external_url' ] = '{}{}' .format (
951
+ self .config .assets_external_path , url_path )
952
+ self ._assets_files .append (file_path )
953
+ return res
954
+
945
955
def _walk_assets_directory (self ):
946
956
walk_dir = self ._assets_folder
947
957
slash_splitter = re .compile (r'[\\/]+' )
948
958
ignore_filter = re .compile (self .assets_ignore ) \
949
959
if self .assets_ignore else None
950
960
951
- def add_resource (p , filepath ):
952
- res = {'asset_path' : p , 'filepath' : filepath }
953
- if self .config .assets_external_path :
954
- res ['external_url' ] = '{}{}' .format (
955
- self .config .assets_external_path , path )
956
- return res
957
-
958
961
for current , _ , files in os .walk (walk_dir ):
959
962
if current == walk_dir :
960
963
base = ''
@@ -979,9 +982,9 @@ def add_resource(p, filepath):
979
982
980
983
if f .endswith ('js' ):
981
984
self .scripts .append_script (
982
- add_resource (path , full ))
985
+ self . _add_assets_resource (path , full ))
983
986
elif f .endswith ('css' ):
984
- self .css .append_css (add_resource (path , full ))
987
+ self .css .append_css (self . _add_assets_resource (path , full ))
985
988
elif f == 'favicon.ico' :
986
989
self ._favicon = path
987
990
@@ -995,12 +998,41 @@ def get_asset_url(self, path):
995
998
996
999
return asset
997
1000
998
- def _on_assets_change ( self , _ ):
999
- # The `_` argument is the name of the file that changed.
1000
- # If we ever setup a logging system, we could use the parameter .
1001
+ # noinspection PyProtectedMember
1002
+ def _on_assets_change ( self , filename , _ , deleted ):
1003
+ # The `_` argument is the time modified, to be used later .
1001
1004
self ._lock .acquire ()
1002
- self ._hard_reload = True
1005
+ self ._hard_reload = True # filename.endswith('js')
1003
1006
self ._reload_hash = _generate_hash ()
1007
+
1008
+ asset_path = filename .replace (self ._assets_folder , '' )\
1009
+ .replace ('\\ ' , '/' ).lstrip ('/' )
1010
+
1011
+ if filename not in self ._assets_files and not deleted :
1012
+ res = self ._add_assets_resource (asset_path , filename )
1013
+ if filename .endswith ('js' ):
1014
+ self .scripts .append_script (res )
1015
+ elif filename .endswith ('css' ):
1016
+ self .css .append_css (res )
1017
+
1018
+ if deleted :
1019
+ if filename in self ._assets_files :
1020
+ self ._assets_files .remove (filename )
1021
+
1022
+ def delete_resource (resources ):
1023
+ to_delete = None
1024
+ for r in resources :
1025
+ if r .get ('asset_path' ) == asset_path :
1026
+ to_delete = r
1027
+ break
1028
+ if to_delete :
1029
+ resources .remove (to_delete )
1030
+
1031
+ if filename .endswith ('js' ):
1032
+ delete_resource (self .scripts ._resources ._resources )
1033
+ elif filename .endswith ('css' ):
1034
+ delete_resource (self .css ._resources ._resources )
1035
+
1004
1036
self ._lock .release ()
1005
1037
1006
1038
def run_server (self ,
0 commit comments