2π
I got it working! Through a combination of PyPDF2 and pdfkit, I got this to work pretty simply. It works on protected pages because django takes care of getting the complete html as a string, which I just pass to pdfkit. It also supports appending attachments, but I doubt (though I havenβt tested) that it works with anything other than pdfs.
from django.template.loader import get_template
from PyPDF2 import PdfFileWriter, PdfFileReader
import pdfkit
def append_pdf(pdf, output):
[output.addPage(pdf.getPage(page_num)) for page_num in range(pdf.numPages)]
def render_to_pdf():
t = get_template('app/template.html')
c = {'context_data': context_data}
html = t.render(c)
pdfkit.from_string(html, 'path/to/file.pdf')
output = PdfFileWriter()
append_pdf(PdfFileReader(open('path/to/file.pdf', "rb")), output)
attaches = Attachment.objects.all()
for attach in attaches:
append_pdf(PdfFileReader(open(attach.file.path, "rb")), output)
output.write(open('path/to/file_with_attachments.pdf', "wb"))
1π
If you just want to secure it, you could write a custom Authentication Backend that lets your server spoof users. Way over-kill but it would solve your problem and at least you get to learn about custom auth backends! (Note: You should be using HTTPS.)
https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#writing-an-authentication-backend
- Create auth backend in
app/auth_backends.py
- Add
app.auth_backends.SpoofAuthBackend
backend tosettings.py
that takes ashared_secret
anduser_id
. - Create a URL route like
url(r'^spoof-user/(?P<user_id>\d+)/$', 'app.views.spoof_user', name="spoof-user")
- Add the view
spoof_user
that must invoke bothdjango.contrib.auth.authenticate
(which invokes backend in #1 above) and after getting user fromauthenticate(...)
you pad the request with the userdjango.contrib.auth.login(request, user)
. Finally, this view should returnHttpResponseForbidden
if the shared secret is wrong orHttpResponseRedirect
to the PDF URL you actually want (after logging in to spoof user programmatically viaauthenticate
andlogin
).
You would probably want to create a random secret key each request using something like cache.set('spoof-user-%s' % user_id, RANDOM_STRING, 30)
which persists shared secret for 30 seconds to allow time for request. Then perform pdf_response = requests.get("%s?shared_secret=1a2b3c&redirect_uri=/path/to/pdf/" % reverse('spoof-user', kwargs={'user_id': 1234}))
. Your new view will test the provided shared_secret
in auth backend, login user to request and perform redirect to request.GET.get('redirect_uri')
.
- [Answered ]-Limiting the number of displayed instances of a model in Django Admin
- [Answered ]-Guest Checkout in django
- [Answered ]-Django not showing updated data from database
-1π
You can use pdfkit to do that. You can retrieve the page using the url and pdfkit will handle the rest:
pdfkit.from_url('http://website.com/somepage', 'somepage.pdf')
You will have to properly access the page using the appropriate headers for it is protected of course:
options = {
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
]
}
pdfkit.from_url('http://website.com/somepage', 'somepage.pdf')
`
- [Answered ]-Django date time filter?
- [Answered ]-How to strip(not remove) specified tags from a html string using Python?