рдкрд░рд┐рдЪрд╛рд▓рди рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди

рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдкрд░ рдЫрд╡рд┐ рдХреА рдХрдо рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди:

1. рдЫрд╡рд┐ рдЯреИрдЧ рдореЗрдВ, рдЕрдиреНрдп рдЖрдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
<img src='/path/to/image.jpg' width: 100px height:150px>
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╣рд╛рдИ-рд╕реНрдкреАрдб рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИред

2. рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдЕрдкрдиреЗ рдЖрдк рд╣реА рдЖрдХрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╣рдж рд╕реБрдирд╕рд╛рди рд░рд╛рд╕реНрддрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рдХрд╣реАрдВ рдЕрднреНрдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

3. рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рднрд╛рдЧ рдореЗрдВ, рдЬрдм рдХреЛрдИ рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдЪрд┐рддреНрд░ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ - xs, s, l, xl рдФрд░ рдЗрдЪреНрдЫрд┐рдд рдЪрд┐рддреНрд░ рд╕рд╣реА рд╕реНрдерд╛рди рдкрд░ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЖрдпрд╛рдо рд╣рдореЗрд╢рд╛ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ - рдХрднреА-рдХрднреА рдЖрдкрдХреЛ n1 рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред (рд▓реЗрдХрд┐рди рдХрдо рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде)

4. рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рдкрд░ рдкрде рд▓рд┐рдЦреЗрдВ: path/to/100x150/image.jpg path/to/100x150/image.jpg ред рдРрд╕реЗ рд░рд╛рд╕реНрддреЛрдВ рдкрд░ рдирд╛рдЬрд╝рд┐рдирдХреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЕрдЧрд░ рдХреЛрдИ рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ рдФрд░ рд╕рд╣реЗрдЬреЗрдВред (рд╕реНрдХреНрд░рд┐рдкреНрдЯ)

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рднрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдорд▓рд╛рд╡рд░ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╡рд┐рднрд┐рдиреНрди рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рд░реЛрдХрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдк рдПрдХ рд╕рд░реНрд╡рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╕рднреА рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╕реНрдХреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

5. getImage(100,150,'image.jpg') рдЬреИрд╕реЗ рдПрдХ рджреГрд╢реНрдп рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрджрд┐ рдпрд╣ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдореВрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрде рджреЗрдВред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдЕрддреНрдпрдзрд┐рдХ рдХреЛрдб рд╣реИ, рдФрд░ рдпрджрд┐ рдореВрд▓ рдЫрд╡рд┐ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдХрдЯ рдСрдл рдЫрд╡рд┐рдпрд╛рдВ рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд░рд╣реЗрдВрдЧреА

6. рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдорд┐рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

 /tmp/ /origin/ /crop/100x150/ /crop/200x300/ 


рдореВрд▓ - рдореВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░,
рдХреНрд░реЙрдк рдПрдХ рдРрд╕рд╛ рдлреЛрд▓реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рд╕рд╛рдЗрдЬреНрдб рдЗрдореЗрдЬ рдХреЗ рд▓рд┐рдП рдлреЛрд▓реНрдбрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
tmp - рдЕрд╕реНрдерд╛рдпреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░

рдбреЗрдореЙрди рдореВрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд╛рд░реАрдЦ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рддрд┐рдерд┐ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд╛рд░реАрдЦ рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдбреЗрдорди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдореЛрдб рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдлрд╕рд▓ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ - рд╡рд╣рд╛рдВ рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдирд╛рдо 000x000 рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓ (рдХреЗрд╡рд▓ рдирд╛рдо) рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдлрд╕рд▓реА рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИ - рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЧрд╛рдпрдм рд╣реЛ - рдХрд╛рд▓реНрдкрдирд┐рдХ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдзрд░реНрдорд╛рдиреНрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдХрд╛рд░ рдлрд╝реЛрд▓реНрдбрд░ рдирд╛рдо рд╕реЗ рд▓реЗрддрд╛ рд╣реИред
tmp/temp_file рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдмрдЪрд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рджрд╛рдирд╡ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рд╕рдВрднрд╡ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЙрд╕ рдкрд░ рдПрдХ рдЕрдЪреНрдЫреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд┐рдЦрдирд╛ рд╣реИред рдпрд╣ рдбреЗрдореЙрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рджреЛрд╖ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ - рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕рдХреА рд╕реВрдЪрдирд╛ рджреЗрдВред рдЕрдЬрдЧрд░-рдбреЗрдореЙрди рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреАрдордирд╛рдЗрдЬреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 # -*- coding: utf-8 -*- import logging import time import os import re from daemon import runner from sets import Set _PATH = os.path.abspath(os.path.dirname(__file__)) LOG_PATH = os.path.abspath(os.path.join(_PATH, '../', 'files', 'logs')) PID_PATH = os.path.abspath(os.path.join(_PATH, '../', 'files', 'tmp')) class Azazel(): '''  ,    .     origin (   )          -    000x000    crop       add_sync_folders  origin_folder -   sync_folder    add_sync_folders -   pidfile_path -   pid  file_save_last_sync_data          LOG_PATH -     PID_PATH -   pid  ''' #    sync_folder = os.path.abspath( os.path.join(_PATH, '../', 'files', 'media', 'crop')) #      #   file_save_last_sync_data = PID_PATH + "/last_update" #    , #    origin_folder = os.path.abspath( os.path.join(_PATH, '../', 'files', 'media', 'origin')) # ,   #  add_sync_folders = [ os.path.abspath(os.path.join(_PATH, '../', 'files', 'tmp', '100x100')), ] pidfile_path = PID_PATH + '/azazel.pid' stdin_path = '/dev/null' stdout_path = '/dev/tty' stderr_path = '/dev/tty' pidfile_timeout = 5 def __init__(self): self.last_time_update = self.get_last_sync_date() def get_last_update_origin_folder(self): '''       ''' last_update = str(os.path.getmtime(self.origin_folder)) return last_update def set_last_update(self, time): '''       ''' #    self.last_time_update = time #    f = open(self.file_save_last_sync_data, 'w') f.write(str(time)) f.close() def get_last_sync_date(self): '''       ''' f = open(self.file_save_last_sync_data, 'r') last_sync = f.read() f.close() return last_sync def get_folders_to_sync(self): '''   ,   .    dir (   )    (-,    -  )         000x000 ''' folders = map( lambda folder_name: self.sync_folder + '/' + folder_name, os.listdir(self.sync_folder)) + self.add_sync_folders logger.info("folders list:" + str(folders)) return filter( lambda folder: re.match('^\d{,4}x\d{,4}$', folder.split('/')[-1]), folders) def folder_sync(self, folder): '''  .  ,             ,    -     ,     ''' logger.info("   :" + folder) #    folder_image_list = os.listdir(folder) #     origin_image_list    folder_image_list new_files = Set(self.origin_image_list) - Set(folder_image_list) logger.info("  :" + str(new_files)) #  for file_to_sync in new_files: #       size = folder.split('/')[-1] command = 'convert "%s" -resize %s "%s"' % ( self.origin_folder + '/' + file_to_sync, size, folder + '/' + file_to_sync, ) logger.info(command) result = os.system(command) logger.info(result) #     folder_image_list    origin_image_list delte_files = Set(folder_image_list) - Set(self.origin_image_list) logger.info(" :" + str(delte_files)) #  for file_to_sync in delte_files: logger.info('delete ' + folder + '/' + file_to_sync) os.remove(folder + '/' + file_to_sync) def sunc_folders(self): '''          ''' #      self.origin_image_list = os.listdir(self.origin_folder) #       for folder in self.get_folders_to_sync(): self.folder_sync(folder) def run(self): logger.info("start daemon azazel") self.sunc_folders() while True: last_update = self.get_last_update_origin_folder() if self.last_time_update < last_update: logger.info(" ") self.sunc_folders() self.set_last_update(last_update) time.sleep(10) daemon = Azazel() logger = logging.getLogger("DaemonLog") logger.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler = logging.FileHandler(LOG_PATH + "/azazel.log") handler.setFormatter(formatter) logger.addHandler(handler) daemon_runner = runner.DaemonRunner(daemon) daemon_runner.daemon_context.files_preserve = [handler.stream] daemon_runner.do_action() 


- рджрд╛рдирд╡ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджреЗрдЦреА, рд╕рд┐рд╡рд╛рдп рд╡реИрдЪрд╛рд░рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ - рд╕рд╡рд╛рд▓ рдЙрдареЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЗрддрдиреА рдмрд╛рд░ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдПрдХ рджрд╛рдирд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред рдореИрдВрдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдФрд░ "рдЕрдЬрд╡рд╛рдЗрди рдкрд░ рдХрд╛рд░реНрдп" рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬреЛ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рджрд░реНрд╢рди рдмрдирд╛ рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдпреЛрдЬрдирд╛ рдореЗрдВред

Source: https://habr.com/ru/post/In154567/


All Articles