Dans les applications Web, les codes de vérification sont souvent utilisés pour la connexion et l'enregistrement. Le code de vérification est essentiellement une image.
Regardons le cycle de vie du code de vérification :
Le client demande le code de vérification
Le serveur restitue le code de vérification :
Rendre une image contenant une chaîne aléatoire
Écrivez une chaîne aléatoire dans la session
Lire l'image et renvoyer la réponse
Soumission du client :
Afficher la réponse (c'est-à-dire l'image du code de vérification)
Obtenir la chaîne de saisie de l'utilisateur
Envoyer la saisie de l'utilisateur
Vérification côté serveur :
Récupérer la chaîne aléatoire enregistrée dans la session et la comparer avec la chaîne soumise par l'utilisateur
Les informations de chaîne sont cohérentes, passez à l'étape suivante
Les informations de chaîne sont incohérentes et un message d'erreur est renvoyé
Ensuite, nous pratiquons le processus ci-dessus dans Django.
Créez un nouveau projet Django nommé ValidCode et créez l'application app01. Configurez le routage comme suit :
from django.conf.urls import urlfrom app01 import views urlpatterns = [ url(r'^test/$', views.test), url(r'^valid_code/$', views.valid_code), ]
, renvoyez la page test.html lorsque le client soumet les données, supprimez-la. de la session. Comparez le code de vérification enregistré avec la chaîne soumise par l'utilisateur : http://127.0.0.1:8000/test/
from django.shortcuts import render, HttpResponse, redirectdef test(request): if request.method == 'GET': return render(request, 'test.html') code1 = request.session['valid_code'] code2 = request.POST.get('valid_code') if code1 == code2: return HttpResponse('OK') else: return redirect('/test/')
<form action="" method="post"> {% csrf_token %} <p> <label for="valid_code">验证码:</label> </p> <p> <input type="text" id="valid_code" name="valid_code"> <img src="/valid_code/" alt="validPic" width="150" style="max-width:90%"><a href="#" class="refresh">刷新</a> </p> <p> <button type="submit">验证</button> </p> </form> <script> var refresh = document.getElementsByClassName('refresh')[0]; var validPic = document.getElementsByTagName('img')[0]; refresh.onclick = function () { validPic.src += "?"; //利用img标签的特性,刷新验证码 } </script>
dans test.html : <img alt="Comment implémenter le code de vérification en js" >
, indiquant qu'une requête get est initiée vers src="/valid_code/"
pour obtenir l'image http://127.0.0.1:8000/valid_code/
et exécutez <a href="#" class="refresh">刷新</a>
pour réobtenir l'image (actualiser le code de vérification) validPic.src += "?"
def valid_code(request): with open('bilibili.jpg', 'rb')as f: res = f.read() valid_code = 'bilibili' request.session["valid_code"] = valid_code return HttpResponse(res)
: http://127.0.0.1:8000/test/
et le serveur renvoie la page test.html /test/
dans la page test.html Attributs de la balise : <img alt="Comment implémenter le code de vérification en js" >
, lancez une demande d'obtention pour src="/valid_code/"
, le serveur renvoie une image /valid_code/
def valid_code(request): from PIL import Image, ImageDraw, ImageFont from io import BytesIO # 内存管理,优化速度 import random img = Image.new(mode='RGB', size=(120, 30), color=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) # 创建图像对象(模式,大小,颜色) draw = ImageDraw.Draw(img, mode='RGB') # 创建画笔(图像对象,模式) font = ImageFont.truetype("app01/static/fonts/kumo.ttf", 28) # 读取字体(字体路径,字体大小) code_list = [] for i in range(5): char = random.choice([chr(random.randint(65, 90)), str(random.randint(1, 9))]) code_list.append(char) draw.text([i * 24, 0], char, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)), font=font) # 通过画笔的text方法,为图像绘制字符串(位置,文本,颜色,字体) # [i * 24, 0] 字体坐标,i*24设置水平偏移,让每个字符分开显示 f = BytesIO() # 拿到一个内存文件句柄f img.save(f, "png") # 保存图像对象到f valid_code = ''.join(code_list) request.session["valid_code"] = valid_code # 验证码写入session return HttpResponse(f.getvalue()) # `getvalue()`方法拿到内存文件句柄的内容
pour optimiser la vitessefrom io import BytesIO
f = BytesIO()
f.getvalue()
http://127.0.0.1:8000/test/
Le code de vérification a été généré en temps réel, et chaque fois que vous cliquez sur Actualiser, une nouvelle image s'affichera.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!