From 1efa9b2166c69f2b2459b1f00e9248c03587528a Mon Sep 17 00:00:00 2001 From: MassiveAtoms Date: Wed, 15 Jul 2020 20:30:04 -0300 Subject: [PATCH 1/3] added cache --- .../__pycache__/settings.cpython-38.pyc | Bin 3380 -> 3642 bytes .../CalibreWebCompanion/settings.py | 20 +++++++++++++-- .../library/__pycache__/models.cpython-38.pyc | Bin 10796 -> 10796 bytes .../library/__pycache__/urls.cpython-38.pyc | Bin 1227 -> 1291 bytes .../library/__pycache__/views.cpython-38.pyc | Bin 7015 -> 7015 bytes CalibreWebCompanion/library/models.py | 24 +----------------- .../library/templates/base.html | 14 +++++----- CalibreWebCompanion/library/urls.py | 2 +- CalibreWebCompanion/library/views.py | 1 + 9 files changed, 29 insertions(+), 32 deletions(-) diff --git a/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc b/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc index 20b35cafbec89ff4b7bef263d7470e7cbe305d04..aaa27cd4fccbb81cd6770d624e6005c69aa1f86e 100644 GIT binary patch delta 662 zcmYjOOHUI~6z-kQbf!Z~OQAeVDZZfgg(!+rlrk11LTjKk<}M`Te3$7!+tEHk(hWOZ z7#F4+7hOo=FQBfB@rQJ&i9f-_h2pdj;<@=w&Uena=X^K!^Z1uQB=2_1Hp_m#_3Xa! z*=#?$%@X5Jv)YxPf_HFbHn8cx(L#ZqZRJTy)<)=5VLQU1UToo@eg1 zI68)VSkgH)OxYjh+$tX>tv9>!9kj+1`J}|5CVE<~S?2a+PMC z9MgNDE_H}Om;wh=Aux4*`Z2&g9|oBpL*2AMT|}ls4FVa>VT@oDS&SiPI2r``w!ouT6vwTMhb6qZXdA>mmfkm;vVyLhq^`rmP4))?uAAG+HCLz~9bTNAn{Ubzk*t`SCnRmww0+Cc nibTxthn{B4Pv?#Ak+*_VwkL>4=(j)x$-LET_Afy*KlGg+O($e2 diff --git a/CalibreWebCompanion/CalibreWebCompanion/settings.py b/CalibreWebCompanion/CalibreWebCompanion/settings.py index e25b9fa..7484635 100644 --- a/CalibreWebCompanion/CalibreWebCompanion/settings.py +++ b/CalibreWebCompanion/CalibreWebCompanion/settings.py @@ -19,6 +19,20 @@ CALIBRE_DIR = os.path.abspath( EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +# optimisation stuff +CONN_MAX_AGE = 60 * 5 + +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', + 'LOCATION': 'unique-snowflake', + "TIMEOUT" : 60 * 5, + + } +} + + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ @@ -33,7 +47,7 @@ STATIC_URL = '/static/' # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ -# SECURITY WARNING: keep the secret key used in production secret! +# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'u(8^+rb%rz5hsx4v^^y(ul7g(4n7a8!db@s*9(m5cs*2_ppy8+' @@ -43,7 +57,7 @@ INTERNAL_IPS = [ '127.0.0.1', # ... ] -# Don't change things beyond this + # SECURITY WARNING: don't run with debug turned on in production! @@ -83,6 +97,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'debug_toolbar.middleware.DebugToolbarMiddleware', # DEBUG purposes + 'django.middleware.cache.UpdateCacheMiddleware', # cache 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', @@ -90,6 +105,7 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.cache.FetchFromCacheMiddleware', # cache ] ROOT_URLCONF = 'CalibreWebCompanion.urls' diff --git a/CalibreWebCompanion/library/__pycache__/models.cpython-38.pyc b/CalibreWebCompanion/library/__pycache__/models.cpython-38.pyc index 4daacd3707a811db84cde2a93468e14108b44ebd..adcae8b0a8596265973aab5aedbd5a8e1afd2cbb 100644 GIT binary patch delta 23 dcmZ1zvL=Ktl$V!_0SIy?^2cx0-N+}W1prBl1>67t delta 23 dcmZ1zvL=Ktl$V!_0SJUR`QuONZ{(BH0sukB1rY!M diff --git a/CalibreWebCompanion/library/__pycache__/urls.cpython-38.pyc b/CalibreWebCompanion/library/__pycache__/urls.cpython-38.pyc index 9f8441360f9f4bb496f5e1fb54633ae0b6c017c6..199ec700a59290a127d3bc4ef5d50faabd84ac33 100644 GIT binary patch delta 432 zcmXZYOHRW;3;@s!`Ly{=(ofm~X$q7gQ6Xi?hGQT$*;G*`3RH!lNee4fi6sb$Di?qQ zu<9|mK`y}+a4p-5v7fD3_}6^5_zmZl0`dCh&Hgq#WS5(ZU@a7(Ewp<*)|rwqp=avc z_-cGB!VrxQ6{HE$L@`M$5EI2FaX>5-PU3>tC>}`*#6fA3bU@Y|sY~PoxhOr7K8S}h zAlV0Lp&XDLg0xWrk|9V3B_tVvbWx5-jzRn}(h1QRs3%T$UGBwwF}YTzXI0Dscgkuj zP14(J_L$_^cEvu~)u6V;JbB2AXeAe=+=JWJiqv*bNQ0-l?756YmKHKu7P5@+52Fg4_;2{9}OB8QL)%aKS6lCm6& zv>{cNjz||$W9f;UKrBnPmrK_N)!kqhr|EUWosPZX*>?A+A^qyv-P8S+_Q8LC$X^zl f4_Xm5i%hjPH%d`p(avo#(XZhEYeI=%{OR65Fj84u diff --git a/CalibreWebCompanion/library/__pycache__/views.cpython-38.pyc b/CalibreWebCompanion/library/__pycache__/views.cpython-38.pyc index 8fe7e250f71f2dfb4dbecf43e208d9b726409013..bde1878620dfcd4db38c9d85a6c83d33b0c7bc7c 100644 GIT binary patch delta 216 zcmaEE_S}p&l$V!_0SF?x_~Q*W@~&cL@%3Ns=OydH6CJqc@lFZDnN4o~$EK%b2lwl>ksl^W+DDlNf6!7Ymg!R&9PIq|L}U zVX~M=KVuh2*DjHG#`eupq8f~hb0<5C^)ODKd_k;$amr>#aXm)Hm6Ho3`WY8bk}PIi Qu(?F?5+ftaWOr!=0C5{atN;K2 delta 216 zcmaEE_S}p&l$V!_0SNXA^T+FNG`W$xkuhvDGmj}FWAbE6 z-hGU*lO#nZ^YCRdMr|(R+seq8HCacXmN9+vDgmI9rpXTkCo$GcE*2_dtla!cNSl$d zf3lcJKVv6I*DjHG# + + - {% if user.is_authenticated %} {% block content %} {% endblock %} {% else %} diff --git a/CalibreWebCompanion/library/urls.py b/CalibreWebCompanion/library/urls.py index 5271440..e66bf6d 100644 --- a/CalibreWebCompanion/library/urls.py +++ b/CalibreWebCompanion/library/urls.py @@ -1,6 +1,6 @@ from django.urls import path from . import views - +from django.views.decorators.cache import cache_page urlpatterns = [ diff --git a/CalibreWebCompanion/library/views.py b/CalibreWebCompanion/library/views.py index 146e306..dbb821d 100644 --- a/CalibreWebCompanion/library/views.py +++ b/CalibreWebCompanion/library/views.py @@ -10,6 +10,7 @@ from django.contrib.auth import login from django.contrib.auth.decorators import login_required + @login_required def index(request): return render(request, 'accounts/index.html') From 915d8369bf4eac652aa40615bdddc22af98b6653 Mon Sep 17 00:00:00 2001 From: MassiveAtoms Date: Thu, 16 Jul 2020 12:43:58 -0300 Subject: [PATCH 2/3] better colab settings --- .../__pycache__/settings.cpython-38.pyc | Bin 3642 -> 3667 bytes .../CalibreWebCompanion/settings.py | 59 +++++++------ .../templates/library/book_detail.html | 79 +++++++++--------- 3 files changed, 73 insertions(+), 65 deletions(-) diff --git a/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc b/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc index aaa27cd4fccbb81cd6770d624e6005c69aa1f86e..cfb16f6265655d401db55168b309d6f2316ecb5f 100644 GIT binary patch delta 646 zcmYjPOKTHR6u$S)on$hT$E0nVCY?5Y*J{)Fs@7*;sZbEXT2YRRAb#VJ8WKs`jhhH= zL=e$&nMJbFeRuu}!IkqLx)E1`)H|Vy_i(@Oo^uc1cMsez&NnA{Kant*TF(yb%2DQh z(rLfujDZmYhp2JleHJ8KzNdBNf2g~W9uI?}uHiOx;-he%-a8 z=a|al>J-T_N+^yhPAWDOryj6nc9-q2hi!%!*)S;$3vnc1BH7WZoCZ#$;yvzh8bpeQ zU{eNZ3}6sL$Y2;*j3DR5Xc&3QViXR>FpdHyFo`M8pb<=C2D6yMJWgQ&r*Q_0o=G_r zDUYSlq1_!-vy^(me`Wg5du|3P8*m7c)Wj`&xJ|-n^o>fnn0N*u|-oz+cd4_no)Ze;vQSLb@-B(c_CS9 zx%>Ooy4PCTYc=WtZwA)p`t9wFovliFd&mE3E%-mhCvEq|tY4Cu!ynosog4n0*c%@8 zzsJ^i>M(CE@}apPTB)G%q*4h)qeU_l^LMSql|VM0yLB=ST5j`cwdMx0)_4qxhxuRY zrl!71Q-+|25K-X2waWf4>nKtTD@Fe({&Aig!Vxw%xy=m~11Tw`CU`%7%VU`~kEJdn I{^!JpKhxc$+5i9m delta 620 zcmYk4O>YuW6o$EXE<Q?#-92(CE)QG=Nz@)NJ_I*cAj1PuLFr00!qtB> zrl&_N!o5)WFuYvDu;_dP`l0a=_~6F~MsXIv7{(FAgr)FNO!5GxFpU|^LdP8Dv0x4H zF@zAtHC)FHEaE1X5JA*Z`8Z-ci1^^-gefD@qZWaNTUf>lRw&sO0R}dZdxA+Oec@bkxqq zJIY!zv%D&__N24u
- download + download
-

{{book.title}}

+

{{book.title}}

by - {% if book.authors %} - {% for author in book.authors.all %} - {{author.name}} - {%endfor%} - {% else %} - {{book.author_sort}} - {%endif%} -
- Published by - {% if book.publishers %} - {% for pub in book.publishers.all %} - {{pub.name}} - {%endfor%} - {% else %} - Unknown - {%endif%} -
- Tags: - {% if book.tags %} - {% for tag in book.tags.all %} - {{tag.name}}, - {%endfor%} - {% else %} - {%endif%} -
- Rating: - {% if book.ratings %} - {% for rating in book.ratings.all %} - {{rating}} - {%endfor%} - {% else %} - {%endif%} -
- {{book.publisher}} + {% if book.authors %} + {% for author in book.authors.all %} + {{author.name}} + {%endfor%} + {% else %} + {{book.author_sort}} + {%endif%} +
+ Published by + {% if book.publishers %} + {% for pub in book.publishers.all %} + {{pub.name}} + {%endfor%} + {% else %} + Unknown + {%endif%} +
+ Tags: + {% if book.tags %} + {% for tag in book.tags.all %} + {{tag.name}}, + {%endfor%} + {% else %} + {%endif%} +
+ Rating: + {% if book.ratings %} + {% for rating in book.ratings.all %} + {{rating}} + {%endfor%} + {% else %} + {%endif%} +
+ {{book.publisher}}

@@ -53,9 +54,9 @@
-{% autoescape off %} -{{comment}} -{% endautoescape %} + {% autoescape off %} + {{comment}} + {% endautoescape %}
{% endblock %} \ No newline at end of file From ac1d7fb5e882027a8eebc3a85d5c8eba7ec8f30b Mon Sep 17 00:00:00 2001 From: MassiveAtoms Date: Thu, 16 Jul 2020 12:45:35 -0300 Subject: [PATCH 3/3] removed files --- .../__pycache__/settings.cpython-38.pyc | Bin 3667 -> 0 bytes CalibreWebCompanion/db.sqlite3 | Bin 131072 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc delete mode 100644 CalibreWebCompanion/db.sqlite3 diff --git a/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc b/CalibreWebCompanion/CalibreWebCompanion/__pycache__/settings.cpython-38.pyc deleted file mode 100644 index cfb16f6265655d401db55168b309d6f2316ecb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3667 zcmb6b$#UCP5`aLFq9|LI?O0xt(2gBPi3Qqm7L6xk8zLcz6>tebSq@57D3JX`Lc+q} zfmVd;T;?`E;6r?zf0!@9HK#euH8YjejMEPQDTZb#4wtv|_PSp$uXmT0@*IAShRepk zFLT_FY%}>`*r)iXf8#k0IGqC?1e@3ScouYl@P~6hh!bOm%)jE+f4#d9- zf8Wp-i10(6EFfkvrq7T?$Xw-cU%=J;RZd^RIg9f-oO3vz-{U^#zTsNja}E~tWytFn zU=a$i1bI03a?axQl~hvU72o6ai*R1Q1k3tmxBx3~5iY@Hcn7Y)DqQU?=Zo;izPG5x&;5OWW58*C+1Z(gyd;<4+dHpJ^>(@YvPq>bjlwJuv9+u%g zJb+K(A$$g(_c9g_U%V9Y>>Kc<{w{2cssHp!fJZNdF{A*0P9a~t6!iDtFYvf0=cs?mwE*|BW0TYhDpl{*fmQC)VE+pR%f&qP0DuLIfQgX&f zgRbY4h+9H|rNA3lU0NC`UrNLWeNsFa+IG>lXi)SHPK`5Nz=Me87hjn6kkCJJmQM~Q z4*C}h@OpS|43ZA1=SI9AEtX}qy4g~UO0^Z`HKp8A+Q!$)x6zWUs*OFRV(c`uwiXqt z^|sQg%c@arYGG=l)Wxfj9MiI;j@dmTE>Hxy)U%1CFz{vqweF$sqAZXDb7%+QdU8Vv zch~Ip$tk<-bsgeJs@JU%r_6BS^3b)u8x&si*jD%G5X%Y+x93~F>5#^NRb@KCcYg+7TxPaN(Cu&eUQ$^mI96vo zBGS;eDMmy5WJsf=JS|lzq7viBnHnvOD5<^@NALH6ff>?8>pY)^A5F`9lSYaIF#Px} zDAU3dev;BMVR42r$IOt-92P#DA|5+q2Ezy!-b%A&mQ>8A04wF1=;!dA(M5bqv?wPx zo9tE5qHLqdDzp~fo^{K|v}Z}?V1SN|qh_45&^f(pteRFp9)@`Yrt38!npf)E)w&Xi zb-AX5iw+4)OgK}5&YIw7nJU?C(i~vv=or2?WNJ#4*ki4D7p_hqQuPvye;x&dJ5zTR zNBqE~^w{&kz<1fg6EXaxT}pg8V3&`FXqIEyCd=q&35Dl}kKa~O&2lYg=%~c)1^rY0 zCvVH2BzQB`@l?Rmw-rzy;>&1t-;|Ic?)s31D{_oCOHC8=56$d&Yad2g!@%~(Fe1UD zx)}Et;=m00`0iW2i+LJl%?^zrIm2Kj*f8|mrmQ8shv*H6tLKJzjSLrwwr7G~VEa+S zqbp}Zphn8G+&m>JBk)9Yi(>2%3D=c(UO?V zClF(|rAC>GvbnphUy3KA-Ds$ra?5DSbw$;p6}5peX0#LxWu@GX8O~Mf$gZl`9bu4b zQNC8KR8(b8ZYfcr)o8?2sK{0%9(tA=Ewq(dQRKZf4GY{>26l~x~Y z)RUF^;C?-tXRx;Z56)j_H^+vbPs)$>S=7?~8pewCg2;jA(ESRbN7$+EJJ_nlulmrm zSpn;zud!?H?Wb9?t`YwQ@kiUq_IoC5`f>3xZ q%n8B-{ukl3@H3uqQOpT^;r~n;j=#(oa#?{xocPB06Vf7>eSZb}LfeP{ diff --git a/CalibreWebCompanion/db.sqlite3 b/CalibreWebCompanion/db.sqlite3 deleted file mode 100644 index 67f7a6598a53e9af389770b6ee0070a2f05203fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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