El primer paso es instalar Pillow
pip install Pillow
El segundo paso es crear un paquete de Python. Tenga en cuenta que debe haber un archivo __init__.py, y luego busque un archivo de fuente en el host de Windows. Soy simhei.ttf
El tercer paso es crear un archivo py con el siguiente contenido:
Importación aleatoria de la PIL importación de imágenes, ImageDraw, ImageFont importación Tiempo de importación OS Importación de cuerda # Captcha códigos de clase Captcha (Objeto): # la clase atributos para extraer Siempre # posición de la fuente font_path = os.path.join (os.path. dirname ( __FILE__ ), ' simhei.ttf ' ) # generan varios códigos número número =. 4 # códigos generados anchura y altura size = (100,40 ) # color de fondo, el RGB blanco predeterminado (rojo, verde, azul ) bgcolor = (0,0,0) # Random color de la fuente random.seed (int (el time.time ())) fontcolor = (el random.randint (200255), el random.randint (100255), el random.randint (100,255 )) # códigos de tamaño de la fuente fontSize = 20 es # estocástico color de interferencia línea LineColor = (el random.randint (0, 250), el random.randint (0255), el random.randint (0, 250 )) # si unirse a la línea de interferencia draw_line = Verdadero # si de líneas de interferencia recibo draw_point = Verdadero # añadido interferencia con líneas Número line_number = 3 SOURCE = list (string.ascii_letters) para el índice en el rango (0,10 ): SOURCE.append (STR (índice)) # se utiliza para generar aleatoriamente una cadena de caracteres (incluyendo alfanumérico) # define como un método de clase, y es privada, no llamar directamente al exterior objeto @classmethod DEF gene_text (CLS): retorno " " .join (random.sample (cls.SOURCE, cls.number)) # de líneas de interferencia recibo @classmethod DEF __gene_line (CLS, dibujar, anchura, altura): el inicio = (el random.randint (0, ancho), Random .randint (0, altura)) End = (el random.randint (0, ancho), el random.randint (0, altura)) draw.line ([el comenzar, terminar], Fill = cls.linecolor) # se utiliza para interferir con la recepción Point @classmethod def __gene_points (cls, draw, point_chance, ancho, alto): chance = min (100 , max (0, int (point_chance))) para w en rango (ancho): para h en rango (alto): tmp = random.randint (0,100 ) si tmp> 100 - chance: draw.point ((w, h), fill = (0,0,0)) # 生成 验证 码 @classmethod def gene_code (cls): width, height = cls.size image = Image.new ( ' RGBA' , (anchura, altura), cls.bgcolor) # Crear mesas de trabajo font = ImageFont.truetype (cls.font_path, cls.fontsize) # códigos fuente Draw = ImageDraw.Draw (Imagen) # Crear cepillo de texto = cls.gene_text ( ) # generado cadena font_width, font_height = font.getsize (texto) draw.text (((anchura - font_width) / 2, (altura - font_height) / 2), texto, fuente = fuente, Fill = cls.fontcolor) IF cls.draw_line: # desplazamiento número_línea veces, es la raíz número_línea pintura líneas de los ejes X en el rango (0, cls.line_number): . CLS __gene_line(Draw, anchura, altura) # Si desea ruido de acuse de recibo SI cls.draw_point: . CLS __gene_points (Draw, 10 , anchura, altura) de retorno (texto, imagen)
El cuarto paso es crear una vista.
de utils.captcha.xfzcaptcha importación Captcha de IO importación BytesIO DEF img_captcha (Request): texto, imagen = Captcha.gene_code () # BytesIO corresponde a un conducto para el almacenamiento de los datos de imagen corriente OUT = BytesIO () # llamada la imagen Guardar método, las fotos almacenadas BytesIO Image.Save (OUT, ' PNG ' ) # la BytesIO el archivo puntero a la posición de inicio out.seek (0) Respuesta = la HttpResponse (el content_type = ' image / png ' ) # de En la canalización BytesIO, lea los datos de la imagen y guárdelos en el objeto de respuesta response.write (out.read ()) respuesta [ ' Content-length ' ] = out.tell () de retorno respuesta
El quinto paso es crear un mapa de enrutamiento de URL
urlpatterns = [ ruta ( ' login / ' , views.login_view, name = ' login ' ), ruta ( ' logout / ' , views.logout_view, name = ' logout ' ), ruta ( ' img_captcha / ' , views.img_captcha, name = ' img_captcha ' ), ruta ( ' register / ' , views.register, name = ' register ' ) ]
El sexto paso, verifique el código de verificación de la imagen que se muestra en nuestra página de inicio de sesión