整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Django框架實戰教程:搭建自動化測試平臺

          Django框架實戰教程:搭建自動化測試平臺

          面是一個使用Django框架搭建自動化測試平臺的基本教程。我們將創建一個簡單的自動化測試平臺,它能夠接收用戶的測試用例提交、執行這些測試用例,并返回測試結果。

          第一步:安裝Django

          確保你已經安裝了Python。然后,在命令行中安裝Django:

          Bash

          深色版本

          1pip install django

          第二步:創建項目

          創建一個新的Django項目:

          Bash

          深色版本

          1django-admin startproject test_platform
          2cd test_platform

          第三步:創建應用

          創建一個名為tests的應用:

          Bash

          深色版本

          1python manage.py startapp tests

          第四步:配置URLs

          編輯test_platform/urls.py文件,將新的應用添加到URL配置中:

          Python

          深色版本

          1from django.contrib import admin
          2from django.urls import path, include
          3
          4urlpatterns=[
          5    path('admin/', admin.site.urls),
          6    path('', include('tests.urls')),
          7]

          在tests應用中創建urls.py文件:

          Python

          深色版本

          1from django.urls import path
          2from . import views
          3
          4urlpatterns=[
          5    path('', views.index, name='index'),
          6    path('submit_test/', views.submit_test, name='submit_test'),
          7    path('results/<int:test_id>/', views.results, name='results'),
          8]

          第五步:編寫視圖

          在tests/views.py文件中編寫視圖函數:

          Python

          深色版本

          1from django.shortcuts import render, redirect, get_object_or_404
          2from .forms import TestForm
          3from .models import Test
          4from django.http import HttpResponse
          5from django.core.files.storage import FileSystemStorage
          6
          7def index(request):
          8    return render(request, 'tests/index.html')
          9
          10def submit_test(request):
          11    if request.method=='POST':
          12        form=TestForm(request.POST, request.FILES)
          13        if form.is_valid():
          14            test=form.save()
          15            # 在這里可以調用腳本來執行測試
          16            return redirect('results', test_id=test.id)
          17    else:
          18        form=TestForm()
          19    return render(request, 'tests/submit_test.html', {'form': form})
          20
          21def results(request, test_id):
          22    test=get_object_or_404(Test, pk=test_id)
          23    # 從數據庫或其他地方獲取測試結果
          24    return render(request, 'tests/results.html', {'test': test})

          第六步:創建模型

          在tests/models.py文件中定義模型:

          Python

          深色版本

          1from django.db import models
          2
          3class Test(models.Model):
          4    name=models.CharField(max_length=200)
          5    description=models.TextField()
          6    file=models.FileField(upload_to='uploads/')
          7    created_at=models.DateTimeField(auto_now_add=True)
          8
          9    def __str__(self):
          10        return self.name

          第七步:創建表單

          在tests/forms.py文件中定義表單:

          Python

          深色版本

          1from django import forms
          2from .models import Test
          3
          4class TestForm(forms.ModelForm):
          5    class Meta:
          6        model=Test
          7        fields=['name', 'description', 'file']

          第八步:創建模板

          在tests/templates/tests目錄下創建模板文件:

          • index.html
          • submit_test.html
          • results.html

          例如,submit_test.html可以這樣創建:

          Html

          深色版本

          1{% extends 'base.html' %}
          2
          3{% block content %}
          4<h1>Submit a New Test</h1>
          5<form method="post" enctype="multipart/form-data">
          6    {% csrf_token %}
          7    {{ form.as_p }}
          8    <button type="submit">Submit Test</button>
          9</form>
          10{% endblock %}

          第九步:數據庫遷移

          運行以下命令創建數據庫表:

          Bash

          深色版本

          1python manage.py makemigrations
          2python manage.py migrate

          第十步:創建靜態文件和媒體文件

          在項目目錄下創建static和media文件夾。然后在settings.py中添加以下設置:

          Python

          深色版本

          1STATIC_URL='/static/'
          2MEDIA_URL='/media/'
          3MEDIA_ROOT=os.path.join(BASE_DIR, 'media')

          第十一步:運行服務器

          啟動開發服務器:

          Bash

          深色版本

          1python manage.py runserver

          第十二步:測試自動化腳本

          在視圖函數submit_test中,你可以添加代碼來執行自動化測試腳本。這通常涉及讀取用戶上傳的文件,解析測試用例,并使用如unittest或pytest這樣的測試框架來運行測試。

          例如,你可以在submit_test函數中添加如下代碼來執行測試腳本:

          Python

          深色版本

          1import subprocess
          2
          3def execute_test_script(file_path):
          4    # 假設測試腳本是一個可執行的Python腳本
          5    try:
          6        output=subprocess.check_output(['python', file_path], stderr=subprocess.STDOUT)
          7        # 將輸出保存到數據庫或返回給用戶
          8        return output.decode('utf-8')
          9    except subprocess.CalledProcessError as e:
          10        # 處理錯誤情況
          11        return e.output.decode('utf-8')

          第十三步:部署

          一旦完成開發和測試,你可以考慮將應用部署到生產環境。可以選擇使用如Heroku、Docker、AWS等服務進行部署。


          以上是從零開始使用Django框架搭建自動化測試平臺的基本步驟。你可以根據實際需求進一步完善功能,例如增加用戶認證、測試報告生成、郵件通知等功能。希望這份指南對你有所幫助!

          一篇:Python之Django系列-創建第一個應用-5

          我們接著上一篇開始,這一篇我們主要會講到投票視圖以及最終投票結果視圖,我們先修改上一篇有說到的polls/templates/polls/detail.html頁面,讓用戶跳轉到這個界面時可以選擇任意一項進行投票,修改后最終代碼如下:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>問題詳情頁</title>
          </head>
          <body>
          <h1>{{ question.question_text }}</h1>
          
          {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
          
          <form action="{% url 'polls:vote' question.id %}" method="post">
          {% csrf_token %}
          {% for choice in question.choice_set.all %}
              <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
              <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
          {% endfor %}
          <input type="submit" value="投票">
          </form>
          </body>
          </html>

          代碼講解

          • {% if error_message %}代表該屬性是否有值,有值的話就顯示出來
          • {% url 'polls:vote' question.id %} 這一塊中的url'polls:vote'的作用是把接口路徑用變量表示,而polls:vote是代表的polls/urls.py中的path('<int:question_id>/vote/', views.vote, name='vote')這一段代碼,polls:vote中的polls需要在polls/urls.py中命名一個全局變量app_name='polls',而vote則引用的path方法中的name='vote'

          polls/urls.py

          • {% csrf_token %}防止跨站點請求偽造
          • forloop.counter指的是循環次數

          這個頁面修改成功后,目前數據庫中的django_question表和django_choice表的數據截圖如下:


          django_question(問題表)


          django_choice(投票記錄表)

          我們啟動服務,打開瀏覽器http://127.0.0.1:8000/polls/1/,可以看到簡單的投票頁面


          投票詳情頁面

          當polls/templates/polls/detail.html頁面完善后,打開頁面看到上圖,但是我們點投票的時候并沒有做視圖相關的業務處理,我們看看detail.html中submit提交的接口為{% url 'polls:vote' question.id %}這個翻譯過來假如question.id=1那么這個地址就是/polls/1/vote,但是我們vote視圖處理目前還是如下代碼

          def vote(request, question_id):
              return HttpResponse("進行投票 %s." % question_id)

          并沒有實現投票的業務邏輯,現在我們稍微來改造下這個方法如下

          from django.shortcuts import render, get_object_or_404
          from django.http import HttpResponse, HttpResponseRedirect
          from django.urls import reverse
          from .models import Question, Choice
          
          # ...為了讓文章篇幅更短,此處省略其他方法
          def vote(request, question_id):
              question=get_object_or_404(Question, pk=question_id)
              try:
                  selected_choice=question.choice_set.get(pk=request.POST['choice'])
              except(KeyError, Choice.DoesNotExist):
                  return render(request, 'polls/detail.html', {'question': question, 'error_message': '你沒有選擇一個選項'})
              else:
                  selected_choice.votes +=1
                  selected_choice.save()
                  return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
          

          代碼講解

          • question=get_object_or_404(Question, pk=question_id) 這個代碼的意思是根據question_id查詢具體問題對象,如打開http://127.0.0.1:8000/polls/2/查詢不到數據則向頁面拋出404,如圖404界面

          404

          • selected_choice=question.choice_set.get(pk=request.POST['choice']) 我們拆開來講,先看request.POST['choice']這個是在detail.html界面單選展示的單選按鈕的name屬性的值,當向接口提交時,這個值則為單選按鈕的value值,我們回顧下前面details.html寫的這段代碼"<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">",value值則為choice.id。而question.choice_set則是查詢與question_id關聯的choice集合,假如question_id=1,那么數據則為如下圖中的三條

          • selected_choice.save() 而這個方法以及上面的question.choice_set.get都是在做數據模型遷移的時候django會幫你自動生成,可以參考文章Python之Django系列-創建第一個應用-4
          • HttpResponseRedirect(reverse('polls:results', args=(question.id,))),還是拆開來講reverse方法最終會解析成'/polls/1/results/'類似這樣,這樣避免URL硬編碼,HttpResponseRedirect意思是返回結果重定向到這個界面

          說到這里,我們就還需要編輯重定向后的視圖以及界面,重定向后的視圖編碼為

          更改前:

          #問題結果頁
          def results(request, question_id):
              return HttpResponse("查看問題的結果 %s." % question_id)

          更改后:

          from django.shortcuts import render, get_object_or_404
          from django.http import HttpResponse, HttpResponseRedirect
          from django.urls import reverse
          from .models import Question, Choice
          
          # ...為了讓文章篇幅更短,此處省略其他方法
          def results(request, question_id):
              question=get_object_or_404(Question, pk=question_id)
              return render(request, 'polls/results.html', {'question': question})

          我們還需要新增polls/templates/polls/results.html界面,如下:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>投票結果</title>
          </head>
          <body>
          <h1>{{ question.question_text }}</h1>
          
          <ul>
          {% for choice in question.choice_set.all %}
              <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
          {% endfor %}
          </ul>
          
          <a href="{% url 'polls:detail' question.id %}">再次投票?</a>
          </body>
          </html>

          編輯完成后,現在我們打開地址:http://127.0.0.1:8000/polls/1/ 選擇任意一個選項,點擊"投票"按鈕,就會展示如下結果:


          點擊再次投票,再跳轉到投票詳情頁面,反復執行,將會看到投票數的變化

          通用視圖

          在使用通用視圖之前,我們先了解下通用視圖的定義,通用意思是重復用,避免重復造輪子,通用視圖旨在將常見的模式抽象化,可以使你在編寫應用時甚至不需要編寫Python代碼。

          既然說是通用視圖,那么我們先來改造視圖,先直接貼出最終代碼:

          from django.shortcuts import render, get_object_or_404
          from django.http import HttpResponse, HttpResponseRedirect
          from django.urls import reverse
          from django.views import generic
          from .models import Question, Choice
          
          
          # Create your views here.
          
          class IndexView(generic.ListView):
              template_name='polls/index.html'
              context_object_name='latest_question_list'
          
              def get_queryset(self):
                  return Question.objects.order_by("-pub_date")[:5]
          
          
          class DetailView(generic.DetailView):
              model=Question
              template_name='polls/detail.html'
          
          
          class ResultsView(generic.DetailView):
              model=Question
              template_name='polls/results.html'
          
          
          def vote(request, question_id):
              question=get_object_or_404(Question, pk=question_id)
              try:
                  selected_choice=question.choice_set.get(pk=request.POST['choice'])
              except(KeyError, Choice.DoesNotExist):
                  return render(request, 'polls/detail.html', {'question': question, 'error_message': '你沒有選擇一個選項'})
              else:
                  selected_choice.votes +=1
                  selected_choice.save()
                  return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

          我們會看到index(),detail(),results()方法已經都被刪除,而新增的有類IndexView,DetailView,ResultsView,下面我們來講講這些變化的地方

          IndexView講解

          新增類IndexView繼承generic.ListView,其中屬性template_name,context_object_name都進行重寫,默認情況下ListView會生成模板<app_name>/<model_name>_list.html,app_name則是我們URLconf(polls/urls.py文件)中的變量,mode_name則是Question,那么默認的模板名字則是"polls/question_list.html",而我們重寫template_name值,則會直接拿重寫后的值也就是"polls/index.html",而context_object_name我們需要重寫則是因為我們html模板需要用到該屬性,以免報錯

          DetailView講解

          DetailView和ResultsView我就挑DetailView描述下,兩個實現原理其實都差不多,這個需要結合改造后的URLconf(polls/url.py)來講,URLconf改造如下:

          改造前:

          from django.urls import path
          from . import views
          
          app_name='polls'
          urlpatterns=[
              path('', views.index, name='index'),#問題列表頁
              path('<int:question_id>/', views.detail, name='detail'),#問題詳情頁
              path('<int:question_id>/results/', views.results, name='results'),#問題結果頁
              path('<int:question_id>/vote/', views.vote, name='vote'),#投票處理器
          ]

          改造后:

          from django.urls import path
          from . import views
          
          app_name='polls'
          urlpatterns=[
              path('', views.IndexView.as_view(), name='index'),#問題列表頁
              path('<int:pk>/', views.DetailView.as_view(), name='detail'),#問題詳情頁
              path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),#問題結果頁
              path('<int:question_id>/vote/', views.vote, name='vote'),#投票處理器
          ]

          其中列表頁,詳情頁,結果頁都已經更改,question_id更改為pk,而這個pk則代表數據庫表的主鍵ID,當我們訪問詳情頁(DetailView)時,傳入主鍵ID,模板就能渲染相關數據,而DetailView的父類generic.DetailView默認的模板地址生成為<app_name>/<model_name>_detail.html,那么就可能變成"polls/question_detail.html",但是該模板頁面我們并沒有開發,所以我們重寫了model以及template_name屬性,最終會生成為"polls/detail.html"

          現在讓我們重新打開http://127.0.0.1:8000/polls/1/看看通用視圖是否生效吧

          下一篇:Python之Django系列-創建第一個應用-7

          構建功能完備且用戶體驗良好的Web應用時,表單驗證是一個不可或缺的部分。本文將深入探討如何使用 Flask 框架集成的 flask-wtf 庫實現網頁表單驗證,并提供詳細的代碼示例以助您快速掌握這一實用技能。

          Flask-WTF簡介

          flask-wtf 是 Flask 用于處理 Web 表單的一個擴展庫,它基于 wtforms 庫,提供了便捷的方式來創建和驗證 HTML 表單。通過 Flask-wtf,您可以輕松定義表單字段、編寫驗證規則并處理提交的數據。

          安裝與配置

          首先確保已安裝 flask-wtf:

          pip install Flask-WTF
          

          在 Flask 應用中引入并初始化 flask-wtf:

          from flask import Flask
          from flask_wtf import FlaskForm
          from wtforms import StringField, PasswordField, SubmitField
          from wtforms.validators import DataRequired, Length, EqualTo
          
          app=Flask(__name__)
          app.config['SECRET_KEY']='your-secret-key'  # 設置一個安全密鑰用于表單驗證
          

          創建表單類與驗證規則

          下面是一個用戶注冊表單的示例,包含用戶名、密碼以及確認密碼字段,其中包含了數據必填性、長度限制以及密碼匹配等驗證規則:

          class RegistrationForm(FlaskForm):
              username=StringField('用戶名', validators=[DataRequired(), Length(min=2, max=20)])
              password=PasswordField('密碼', validators=[DataRequired()])
              confirm_password=PasswordField('確認密碼', 
                                              validators=[DataRequired(), EqualTo('password', message='兩次密碼不一致')])
              submit=SubmitField('Sign Up')
          

          視圖函數中的表單處理

          在視圖函數中,我們可以實例化表單對象,渲染表單至模板,并處理表單提交后的驗證結果:

          @app.route('/register', methods=['GET', 'POST'])
          def register():
              form=RegistrationForm()
          
              if form.validate_on_submit():  # 驗證表單數據
                  # 這里是處理有效表單數據的邏輯,例如保存到數據庫
                  flash('用戶注冊成功!', 'success')
                  return redirect(url_for('index'))
          
              return render_template('register.html', title='Register', form=form)
          

          模板中的表單渲染

          在 Jinja2 模板文件(如 templates/register.html)中,我們可以渲染表單:

          <!DOCTYPE html>
          <html lang="zh-CN">
          <head>
              <title>{{ title }}</title>
          </head>
          <body>
              <h1>用戶注冊</h1>
              <form method="POST" action="{{ url_for('register') }}">
                  {{ form.csrf_token }}  <!-- 添加CSRF令牌 -->
                  <div>
                      {{ form.username.label }}<br>
                      {{ form.username(size=20) }}
                  </div>
                  <div>
                      {{ form.password.label }}<br>
                      {{ form.password() }}
                  </div>
                  <div>
                      {{ form.confirm_password.label }}<br>
                      {{ form.confirm_password() }}
                  </div>
                  <div>
                      {{ form.submit() }}
                  </div>
              </form>
          </body>
          </html>
          

          通過以上步驟,我們成功地在 Flask 應用中使用了 flask-wtf 實現了一個具有驗證功能的用戶注冊表單。

          處理表單驗證失敗

          當表單驗證失敗時(form.validate_on_submit()返回False),flask-wtf會將驗證錯誤信息存儲在表單對象中。我們可以在模板中遍歷這些錯誤并顯示給用戶:

          <!-- 在templates/register.html中添加錯誤信息顯示 -->
          {% for field, errors in form.errors.items() %}
              {% for error in errors %}
                  <p style="color: red;">{{ form[field].label }}: {{ error }}</p>
              {% endfor %}
          {% endfor %}
          

          自定義錯誤消息

          在某些情況下,您可能需要為特定字段或驗證器提供自定義錯誤消息。這可以通過在定義表單類時直接指定驗證器的message參數來實現:

          from wtforms import ValidationError
          
          class RegistrationForm(FlaskForm):
              # ...
              
              def validate_username(self, username_field):
                  if User.query.filter_by(username=username_field.data).first():
                      raise ValidationError('Username already exists. Please choose another one.')
          

          總結

          通過flask-wtf,我們可以高效且規范地管理Web應用中的表單驗證和數據處理流程。結合wtforms強大的驗證器庫,您可以根據需求創建各種復雜度的表單,并確保用戶的輸入滿足預設的業務規則。

          實踐是檢驗真理的唯一標準,鼓勵各位讀者在實際項目開發中嘗試運用flask-wtf進行表單驗證,不斷優化和完善代碼邏輯,從而提升Python Web開發的能力和效率。

          關注我,手把手帶你快速入門Python Web編程!


          主站蜘蛛池模板: 国产一区高清视频| 日韩精品无码中文字幕一区二区 | 无码精品尤物一区二区三区| 久久免费精品一区二区| 国产精品无码一区二区在线观一| 国产一区二区三区免费看| 亚洲成av人片一区二区三区 | 中文字幕亚洲综合精品一区| 日韩精品一区二区三区中文精品| 国产精品日韩欧美一区二区三区| 精品乱人伦一区二区| 亚洲AV无码一区二区乱子伦 | 国产MD视频一区二区三区| 国产美女av在线一区| 亲子乱av一区区三区40岁| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久精品道一区二区三区| 立川理惠在线播放一区| 国产日韩精品一区二区在线观看播放| 日本在线视频一区二区三区| 国产一区二区三区手机在线观看| 国产一区三区二区中文在线 | 无码人妻精一区二区三区 | 亚洲永久无码3D动漫一区| 91国在线啪精品一区| 免费高清在线影片一区| 欧洲精品无码一区二区三区在线播放| 老熟女高潮一区二区三区| 精品少妇一区二区三区在线 | 成人毛片一区二区| 自拍日韩亚洲一区在线| 国产精品无圣光一区二区| 日韩精品无码人妻一区二区三区 | 精品国产一区二区二三区在线观看| 老熟妇仑乱一区二区视頻| 亚洲一区二区在线免费观看| 国产色精品vr一区区三区| 国产成人精品一区二区三在线观看| 久久人做人爽一区二区三区| 在线观看一区二区三区视频| 日韩视频免费一区二区三区|