我正在做一个项目,允许我使用 django 将书籍上传到数据库。 出于测试目的和我为了节省时间,我想自动创建一本书的多个实例到数据库。
这是帮助我实现这一目标的代码
import random
import string
import httplib2
from urllib.parse import urlencode
base_url = "http://localhost:8002/addbook/"
def generate_data():
"""
Generate a dictionary of random book data.
"""
data = {}
data["title"] = "".join(random.choices(string.ascii_uppercase, k=8))
data["author_name"] = "".join(random.choices(string.ascii_uppercase, k=8))
data["coauthors_name"] = "".join(
random.choices(string.ascii_uppercase, k=8))
data["publisher_name"] = "".join(
random.choices(string.ascii_uppercase, k=8))
data["isbn"] = "".join(random.choices(string.digits, k=13))
data["genres_name"] = "".join(random.choices(string.ascii_uppercase, k=8))
data["edition"] = "".join(random.choices(string.ascii_uppercase, k=8))
data["description"] = "".join(random.choices(string.ascii_uppercase, k=50))
data["book_file"] = "/home/dubsy/A Guide to Broiler Chicken Growth Boosters & Probiotics.pdf"
return data
# Send a GET request to the book upload page to get the CSRF token
http = httplib2.Http()
response, content = http.request(base_url, "GET")
csrf_token = response["set-cookie"].split("=")[1].split(";")[0]
# Generate and send POST requests to upload 100 books
for i in range(100):
data = generate_data()
data_encoded = urlencode(data).encode("utf-8")
headers = {
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": f"csrftoken={csrf_token}",
"Referer": base_url,
"X-CSRFToken": csrf_token,
}
response, content = http.request(
base_url, "POST", body=data_encoded, headers=headers
)
print(f"Response {i+1}: {response}")
print(content.decode('utf-8'))
代码运行成功,但是它没有将任何内容发布到数据库,而是我在终端中得到以下响应。
Response 1: {'date': 'Fri, 14 Apr 2023 18:21:14 GMT', 'server': 'WSGIServer/0.2 CPython/3.9.12', 'content-type': 'text/html; charset=utf-8', 'x-frame-options': 'DENY', 'vary': 'Cookie', 'content-length': '2931', 'x-content-type-options': 'nosniff', 'referrer-policy': 'same-origin', 'cross-origin-opener-policy': 'same-origin', 'set-cookie': 'csrftoken=hCk4LKQWIvX4TsmC2frQxuOMy3OSsOWY; expires=Fri, 12 Apr 2024 18:21:14 GMT; Max-Age=31449600; Path=/; SameSite=Lax', 'status': '200'}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload Books</title>
<link rel="stylesheet" href="/static/css/quartz.css">
<link rel="stylesheet" href="/static/css/addbook.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="javascript:;">Library Management System</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Books</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Authors</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Contact Us</a>
</li>
</ul>
<ul class="navbar-nav ms-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<img src="" class="rounded-circle border border-3 border-white" alt="Avatar"
height="45" width="45">
</a>
<ul class="dropdown-menu dropdown-menu-end mt-2" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="/profile/None/">Profile</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="/signout/">Sign Out</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-sm">
<div class="card">
<div class="card-header">
<h3 class="text-center">Upload Book</h3>
</div>
<div class="card-body">
<form action="/addbook/" method="post" onsubmit="removeISBNMask()" id="addbook" class="needs-validation"
enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrfmiddlewaretoken" value="bdQVi4p3VyMHLpGLfpeAlNMHQy0zNEjAiF0PTE5PtTzBuHSd7uvgI7qjerEh5i5o">
<script src="/static/js/index.js" async></script>
<script src="/static/js/addbook.js" async></script>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
它返回一个
status=200
响应和我的用于上传书籍的表单模板,除了表单是空的并且它不会向数据库返回任何内容。
views.py
def addbook(request):
# if not request.user.is_superuser:
# return redirect(notfound)
# else:
books = Books.objects.all()
genres = Genre.objects.all()
authors = Author.objects.all()
coauthors = CoAuthor.objects.all()
publishers = Publisher.objects.all()
if request.method == "POST":
form = BookForm(request.POST, request.FILES)
if form.is_valid():
book = request.FILES.get("book_file")
title = request.POST.get("title")
isbn = request.POST.get("isbn")
genres_name = request.POST.getlist("genres_name")
author_name = request.POST.get("author_name")
co_authors = request.POST.getlist("coauthors_name")
publisher_name = request.POST.get("publisher_name")
author_name, created = Author.objects.get_or_create(
name=author_name.title()
)
publisher, created = Publisher.objects.get_or_create(
name=publisher_name.title()
)
book = Books.objects.create(
isbn=isbn,
title=title.title(),
publisher=publisher,
edition=request.POST.get("edition"),
author=author_name,
book_file=book,
)
for genre in genres_name:
genre, created = Genre.objects.get_or_create(
name=genre.lower())
book.genres.add(genre)
if co_authors:
for co_author in co_authors:
coauthor, created = CoAuthor.objects.get_or_create(
name=co_author.title()
)
book.coauthors.add(coauthor)
return redirect(addbook)
else:
form = BookForm()
context = {
"form": form,
"genres": genres,
"authors": authors,
"publishers": publishers,
"books": books,
"coauthors": coauthors,
}
return render(request, "books/addbook.html", context)
我做错了什么