看看这个bộ thay đổi cho Django .Tôi cần chức năng này, nhưng bản vá này là từ phiên bản 1.7 của Django và tôi không thể sử dụng nó trong môi trường của mình (chỉ Python 2.6). Vì vậy bây giờ tôi đã sao chép quản trị_view
phương pháp mã của tôi và sử dụng admin.site.admin_view = một phần(admin_view, admin.site)
Tiêm nó.
Tuy nhiên, tôi muốn giữ số lượng mã "rẽ nhánh" ở mức tối thiểu và muốn biết: liệu có thể vá nó không, tức là thay thế tự.đăng nhập
chức năng chuyển hướng_đến_đăng nhập
hiện hữubên trong
để thực thi chức năng trang trí trong phạm vi?
Tôi biết đây sẽ là một vụ hack độc ác, tuy nhiên, tôi muốn biết mình có thể đi được bao xa với Python.
django.contrib.admin.sites.inner = yourfunctionhere
biên tập:
Ồ. Tôi hơi xấu hổ vì đã để chuyện này ngồi đây lâu như vậy. Tôi nhớ lờ mờ bài viết của mình dựa trên cách thứ hai (xem bình luận bên dưới), nhưng tôi không nhớ đủ chi tiết để tìm lại. Vì vậy, tôi chỉ khuyên bạn nên phân lớp Trang web quản trị
.
EDIT 2: Sau khi tìm kiếm, tôi tìm thấy cái này:
Có tồn tại tính năng ghi đè tương đương cho các hàm lồng nhau không?
Hàm "monkey_patch_fn" thực hiện chính xác những gì bạn muốn và hiển thị một cách tiếp cận khả thi. Nó có thể đầy đủ hoặc không.
Kế hoạch ban đầu của tôi là sửa đổi chức năng thông qua việc tháo gỡ, nhưng tôi vẫn gặp vấn đề với các thuộc tính ở chế độ chỉ đọc (tôi认为là những gì bài viết gốc của tôi đề cập đến)...nhưng tôi không thể tìm thấy nó).
Chỉnh sửa 3:
Sử dụng tên sự chơi phụ
Mô-đun đã tìm thấy một cách khác. Tôi mừng vì mình đã không bỏ cuộc nhanh thế. Tôi thích cách này hơnrất nhiều. Nó có lẽ cũng khá rắc rối, nhưng tôi tin rằng một mô-đun được xuất bản hoàn chỉnh sẽ thận trọng hơn một câu trả lời ngẫu nhiên cho một vấn đề cụ thể.
Dẫu sao thì. Vì tôi không muốn xem mã Django ngay bây giờ nên tôi sẽ cung cấp một ví dụ đủ. Đầu tiên là thiết lập.
từ nhập byteplay *
nhập khẩu
kiểm tra chắc chắn():
def printone():
in 1
printone()
def printtwo():
in 2
dis.dis(kiểm tra)
Đầu ra ở đây là
2 0 LOAD_CONST 1 (
", dòng 1>)
3 MAKE_FUNCTION 0
6 CỬA HÀNG_FAST 0 (in)
4 9 LOAD_FAST 0 (in)
12 GỌI_CHỨC NĂNG 0
15 POP_TOP
16 LOAD_CONST 0 (Không có)
19 RETURN_VALUE
Vì vậy, sau đó chúng tôi sử dụng sự chơi phụ
chuyển đổi nó thành Code
đối tượng, chỉnh sửa nó và biến nó trở lại mã byte bình thường.
mã kiểm tra = Code.from_code(test.__code__)
in testcode.code
Đầu ra là:
[(SetLineno, 2), (LOAD_CONST, <đối tượng="" byteplay.code="" tại="" 0x7f72096e6a50="">), (MAKE_FUNCTION, 0), (STORE_FAST, 'printone'), (SetLineno, 4), (LOAD_FAST, 'printone'), (CALL_FUNCTION , 0), (POP_TOP, Không có), (LOAD_CONST, Không có), (RETURN_VALUE, Không có)]
đối>
nó phản ánh dis
. Vì vậy, chúng ta chỉ cần thay đổiCode
đối tượng và đặt mã mới vào đối tượng ban đầu.
testcode.code[1] = (LOAD_CONST, Code.from_code(printtwo.__code__))
test.__code__ = testcode.to_code()
dis.dis(kiểm tra)
Bài kiểm tra()
Đầu ra hơi lộn xộn, nhưng chúng tôi thấy:
5 0 LOAD_CONST 1 (<đối tượng="" mã="" printtwo="" tại="" 0x7fc668476230,="" tệp="" "byteplaytest.py",="" dòng="" 9="">)
3 MAKE_FUNCTION 0
6 CỬA HÀNG_FAST 0 (in)
7 9 LOAD_FAST 0 (in)
12 GỌI_CHỨC NĂNG 0
15 POP_TOP
16 LOAD_CONST 0 (Không có)
19 RETURN_VALUE
2
đối>
Vì vậy chúng tôi đang tải printhai
hàm, hãy lưu nó dưới dạng tên biến cục bộ bản in
chức năng bên dưới, và sau đó là cuối cùng 2
Nó vừa được gọi thành công printhai
函数。
Điều này sẽ cung cấp một lời giải thích toàn diện về những gì bạn cần làm. Bạn sẽ cần phải sử dụng dis
để xác định dòng nào trong mã byte bạn cần thay đổi, nhưng tôi nghĩ bạn chỉ nên thay đổi LOAD_CONST
. Tất nhiên là tôi chưa thử cái này trên thư viện hay bất cứ thứ gì... nhưng nếu có bất kỳ vấn đề nào, vui lòng cho tôi biết.
Tôi là một lập trình viên xuất sắc, rất giỏi!