current position:Home>Elegant implementation of Django model field encryption
Elegant implementation of Django model field encryption
2022-01-30 08:09:14 【Coffee bar】
An earlier article Django Example of developing password management table Yes, we wrote a password management tool to manage passwords , At that time, the function of encryption and decryption was view Layer implementation , It has been running stably, so it doesn't pay too much attention to whether the implementation is elegant . Recently, we need to add a few more password tables. Looking back at the previous code, we find that the encryption and decryption is in view Layer implementation is cumbersome , Especially with Sadmin The public library after view The code is much simpler , If you stay view Layer handling is obviously not elegant , It's time to achieve... In a more elegant way
Sadmin Additions and deletions
Adding, deleting, modifying and querying database tables is the most commonly used function in the development process , The previous article also introduced us through encapsulation Sadmin The public library With the most concise code to achieve the addition, deletion, modification and query of the table , How concise is it , Look at the code below
class TableList(ListCreateView):
model = Table
template = 'password/table.html'
permission = {'get': 'password.select_table', 'post': 'password.create_table'}
class TableDetail(RetrieveUpdateDestroyView):
model = Table
permission = {'get': 'password.select_table', 'put': 'password.update_table',
'delete': 'password.delete_table'}
Copy code
TableList
Class can query tables and create new table data ,TableDetail
You can query a single piece of data in the table 、 Modification and deletion , Corresponds to two URL
path('table/', views.TableList.as_view(), name='table-list-url'),
path('table/<int:pk>/', views.TableDetail.as_view(), name='table-detail-url'),
Copy code
If in view If the layer implements the encryption of table fields , That's going to be rewritten TableList
Of post Method , as well as TableDetail
Class put Method , Very trouble , So what's more elegant ? It is better to handle the table fields when the table changes , Directly in model Layer is obviously better than view More appropriate ,model If it is implemented through Django Of signals or rewrite model Of save Method All good choices
As for the use of signals Or rewrite save Method , Both can be achieved , Personally, I think rewriting is adopted for simple processing logic save It's a better way , For complex processing logic signals Clearer , For our need to encrypt fields , The logic is simple, and the code doesn't need too much , Directly adopt rewriting save Just the way
rewrite model Of save Method
For the core code of encryption and decryption, you can refer to the article Django Example of developing password management table Given the source code , rewrite model Of save The method code is as follows
class Table(models.Model):
username = models.CharField(max_length=64, verbose_name=' user name ')
password = models.CharField(max_length=512, verbose_name=' password ')
def __str__(self):
return self.application_name
def save(self, *args, **kwargs):
_encrypt = True
if self.pk:
old_password = Table.objects.get(id=self.id)
_encrypt = False if old_password.password == self.password else True
if _encrypt:
_m = RsaCrypto().encrypt(self.password)
if _m.get('state'):
self.password = _m.get('message')
else:
raise Exception(' Encryption failed :' + _m.get('message'))
super(Table, self).save(*args, **kwargs)
Copy code
For password encryption , Usually new records will be added for the first time , And update the record when the password changes
whenever save How to judge is insert still update Well ? It can be determined by whether there is self.pk
To judge ,Django Of model There must be a field for the primary key , If the user does not set the primary key field , that Django By default, a file named id
The field of is used as the primary key , The primary key is also used pk
Alias to denote , So you can go through self.pk
Whether it exists to judge this save Is it insert still update
When this time save by update when , We also need to determine whether the password field has changed , If there is no change, there is no need to call the encryption method , To determine whether the field changes, you need to obtain the value before the field is submitted , The value before submission can be through Table.objects.get(id=self.id)
To get
With all this information , Then encryption will come naturally . We gracefully implement the field encryption , What about decryption ? Personally, I think it's the same model Libby wrote veiw It's more suitable , Can be in mdel Add a decode_password
Methods
class Table(models.Model):
...
def decode_password(self):
_m = RsaCrypto().decrypt(self.password)
if _m.get('state'):
return {
'state': 1,
'message': _m.get('message'),
'username': self.username
}
else:
return {'state': 0, 'message': 'Error: ' + _m.get('message')}
Copy code
Call... When decryption is required Model Of decode_password
The method is ok
def decode_password(request, pk):
try:
_t = Table.objects.get(id=pk)
return JsonResponse(_t.decode_password())
except Exception as e:
return JsonResponse({'state': 0, 'message': 'Error: ' + str(e)})
Copy code
At the end
I'm a little obsessed with code , The implementation function is also simple and practical , can 2 OK, I'll never write 3 That's ok , If there is a better solution, you will not hesitate to reconstruct , At the same time, we firmly oppose “ It's not useless ” That's what I'm saying . Whether the above implementation is elegant , Or there is a better solution , Welcome to discuss
copyright notice
author[Coffee bar],Please bring the original link to reprint, thank you.
https://en.pythonmana.com/2022/01/202201300809117381.html
The sidebar is recommended
- [recalling the 1970s] using Python to repair the wonderful memories of parents' generation, black-and-white photos become color photos
- You used to know Python advanced
- Pyinstaller package Python project
- 2021 IEEE programming language rankings: Python tops the list!
- Implementation of Python automatic test control
- Python advanced: [Baidu translation reverse] graphic and video teaching!!!
- Do you know the fuzzy semantics in Python syntax?
- [Python from introduction to mastery] (XXVII) learn more about pilot!
- Playing excel office automation with Python
- Some applications of heapq module of Python module
guess what you like
-
Python and go languages are so popular, which is more suitable for you?
-
Python practical skills task segmentation
-
Python simulated Login, numpy module, python simulated epidemic spread
-
Python opencv contour discovery function based on image edge extraction
-
Application of Hoff circle detection in Python opencv
-
Python reptile test ox knife (I)
-
Day 1: learn the Django framework of Python development
-
django -- minio_ S3 file storage service
-
[algorithm learning] 02.03 Delete intermediate nodes (Java / C / C + + / Python / go)
-
Similarities and differences of five pandas combinatorial functions
Random recommended
- Learning in Python + opencv -- extracting corners
- Python beginner's eighth day ()
- Necessary knowledge of Python: take you to learn regular expressions from zero
- Get your girlfriend's chat records with Python and solve the paranoia with one move
- My new book "Python 3 web crawler development practice (Second Edition)" has been recommended by the father of Python!
- From zero to familiarity, it will take you to master the use of Python len() function
- Python type hint type annotation guide
- leetcode 108. Convert Sorted Array to Binary Search Tree(python)
- For the geometric transformation of Python OpenCV image, let's first talk about the extraordinary resize function
- leetcode 701. Insert into a Binary Search Tree (python)
- For another 3 days, I sorted out 80 Python datetime examples, which must be collected!
- Python crawler actual combat | using multithreading to crawl lol HD Wallpaper
- Complete a python game in 28 minutes, "customer service play over the president card"
- The universal Python praise machine (commonly known as the brushing machine) in the whole network. Do you want to know the principle? After reading this article, you can write one yourself
- How does Python compare file differences between two paths
- Common OS operations for Python
- [Python data structure series] linear table - explanation of knowledge points + code implementation
- How Python parses web pages using BS4
- How do Python Network requests pass parameters
- Python core programming - decorator
- Python Network Programming -- create a simple UPD socket to realize mutual communication between two processes
- leetcode 110. Balanced Binary Tree(python)
- Django uses Django celery beat to dynamically add scheduled tasks
- The bear child said "you haven't seen Altman" and hurriedly studied it in Python. Unexpectedly
- Optimization iteration of nearest neighbor interpolation and bilinear interpolation algorithm for Python OpenCV image
- Bilinear interpolation algorithm for Python OpenCV image, the most detailed algorithm description in the whole network
- Use of Python partial()
- Python game development, pyGame module, python implementation of angry birds
- leetcode 1104. Path In Zigzag Labelled Binary Tree(python)
- Save time and effort. 10 lines of Python code automatically clean up duplicate files in the computer
- Learn python, know more meat, and be a "meat expert" in the technical circle. One article is enough
- [Python data structure series] "stack (sequential stack and chain stack)" -- Explanation of knowledge points + code implementation
- Datetime module of Python time series
- Python encrypts and decrypts des to solve the problem of inconsistency with Java results
- Chapter 1: introduction to Python programming-4 Hello World
- Summary of Python technical points
- 11.5K Star! An open source Python static type checking Library
- Chapter 2: Fundamentals of python-1 grammar
- [Python daily homework] day4: write a function to count the number of occurrences of each number in the incoming list and return the corresponding dictionary.
- Python uses turtle to express white