Django管理客户端

django-admin-client的Python项目详细描述


django管理客户端

安装

pip install django-admin-client

用法

3个主要用途:

  1. 方便的http get和post方法
  2. 动态django管理python客户端
  3. 生成特定的django admin python客户端

一。方便的http get和post方法

DjangoAdminBase将执行自动登录、会话管理、自动csrf令牌包含和自动错误检测

fromdjango_admin_clientimportDjangoAdminBasebasic_client=DjangoAdminBase('http://127.0.0.1:9000/admin','superuser','why-dont-tell-mom?')# auto login:basic_client.get_with_auto_login('/')# <Response [200]># response is just our favorite and well-known response from 'requests' librarytype(basic_client.get_with_auto_login('/'))# requests.models.Response# auto login (if not yet logged in or session expired),# csrf token included in POST request automatically,# errors in response html form detected and providedbasic_client.post_with_csrf_and_auto_login('/auth/user/add/',{'username':'test','password1':'123','password2':'123'})#{'response': <Response [200]>,# 'errors': [<div class="form-row errors field-password2">#  <ul class="errorlist"><li>This password is too short. It must contain at least 8 characters.</li><li>This password is too common.</li><li>This password is entirely numeric.</li></ul>#  <div>#  <label class="required" for="id_password2">Password confirmation:</label>#  <input id="id_password2" name="password2" required="" type="password"/>#  <div class="help">Enter the same password as before, for verification.</div>#  </div>#  </div>]}basic_client.post_with_csrf_and_auto_login('/auth/user/add/',{'username':'test','password1':'isthislongenough','password2':'isthislongenough'})# {'response': <Response [200]>, 'errors': []}

2.动态django管理python客户端

DjangoAdminBase还可以在django管理站点上进行内省并生成规范。

In[1]:spec=basic_client.generate_spec()In[2]:importjsonIn[3]:json.dumps(spec,indent=2)Out[3]:{"models":{"groups":{"id":"groups","app":"auth","name":"group","fields":{"name":{"name":"name","required":true,"default_value":""},"permissions":{"name":"permissions","required":false,"default_value":""}}},"users":{"id":"users","app":"auth","name":"user","fields":{"username":{"name":"username","required":true,"default_value":""},"password1":{"name":"password1","required":true,"default_value":""},"password2":{"name":"password2","required":true,"default_value":""}}}}}

然后可以将此规范馈送到DjangoAdminDynamic类以获取动态管理python客户端。

fromdjango_admin_clientimportDjangoAdminBase,DjangoAdminDynamicbasic_client=DjangoAdminBase('http://127.0.0.1:9000/admin','superuser','why-dont-tell-mom?')spec=basic_client.generate_spec()dynamic_client=DjangoAdminDynamic(spec=spec,client=basic_client)dynamic_client.users.all()# {'response': <Response [200]>, 'ids': ['1', '2']}

现在您可以使用<model-name>.add(item: dict)

添加对象
dynamic_client.users.add({})#{'id': None,# 'created': False,# 'errors': [<div class="form-row errors field-username">#  <ul class="errorlist"><li>This field is required.</li></ul>#  <div>#  <label class="required" for="id_username">Username:</label>#  <input autofocus="" class="vTextField" id="id_username" maxlength="150" name="username" required="" type="text"/>#  <div class="help">Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.</div>#  </div>#  </div>, <div class="form-row errors field-password1">#  <ul class="errorlist"><li>This field is required.</li></ul>#  <div>#  <label class="required" for="id_password1">Password:</label>#  <input id="id_password1" name="password1" required="" type="password"/>#  <div class="help"><ul><li>Your password can't be too similar to your other personal information.</li><li>Your password must contain at least 8 characters.</li><li>Your password can't be a commonly used password.</li><li>Your password can't be entirely numeric.</li></ul></div>#  </div>#  </div>, <div class="form-row errors field-password2">#  <ul class="errorlist"><li>This field is required.</li></ul>#  <div>#  <label class="required" for="id_password2">Password confirmation:</label>#  <input id="id_password2" name="password2" required="" type="password"/>#  <div class="help">Enter the same password as before, for verification.</div>#  </div>#  </div>],# 'response': <Response [200]>}dynamic_client.users.add({'username':'fromdynamic','password1':'qwertyuio!','password2':'qwertyuio!'})# {'id': '3', 'created': True, 'errors': [], 'response': <Response [200]>}

使用<model-name>.all()

获取所有对象ID
dynamic_client.users.all()# {'ids': ['3', '1', '2'], 'response': <Response [200]>}

使用<model-name>.find(query: str)

搜索对象id
dynamic_client.users.find('fromdynamic')# {'id': '3', 'response': <Response [200]>}

使用<model-name>.get(object_id: str)

获取对象字段
>>>dynamic_client.users.get('3'){'response':<Response[200]>,'details':{'username':'fromdynamic','password':'<N/A>','first_name':'','last_name':'','email':'','is_active':'','is_staff':'','is_superuser':'','groups':[],'user_permissions':[],'last_login_0':'','last_login_1':'','date_joined_0':'2019-03-06','date_joined_1':'13:00:00'}}

使用<model-name>.change(object_id: str, fields: dict)

更改对象
In[1]:dynamic_client.users.change('3',{'is_superuser':'1'})Out[1]:{'success':False,'errors':[<divclass="form-row errors field-username"><ulclass="errorlist"><li>Thisfieldisrequired.</li></ul><div><labelclass="required"for="id_username">Username:</label><inputclass="vTextField"id="id_username"maxlength="150"name="username"required=""type="text"/><divclass="help">Required.150charactersorfewer.Letters,digitsand@/./+/-/_only.</div></div></div>,<divclass="form-row errors field-date_joined"><ulclass="errorlist"><li>Thisfieldisrequired.</li></ul><div><labelclass="required"for="id_date_joined_0">Datejoined:</label><pclass="datetime">Date:<inputclass="vDateField"id="id_date_joined_0"name="date_joined_0"required=""size="10"type="text"/><br/>Time:<inputclass="vTimeField"id="id_date_joined_1"name="date_joined_1"required=""size="8"type="text"/></p><inputid="initial-id_date_joined_0"name="initial-date_joined_0"type="hidden"/><inputid="initial-id_date_joined_1"name="initial-date_joined_1"type="hidden"/></div></div>],'response':<Response[200]>}In[2]:dynamic_client.users.change('3',...:{'username':'fromdynamic',...:'is_active':'1',...:'is_staff':'1',...:'is_superuser':'1',...:'date_joined_0':'2019-03-06','date_joined_1':'13:00'})Out[2]:{'success':True,'errors':[],'response':<Response[200]>}In[3]:dynamic_client.users.get('3')Out[3]:{'response':<Response[200]>,'details':{'username':'fromdynamic','password':'<N/A>','first_name':'','last_name':'','email':'','is_active':'1','is_staff':'1','is_superuser':'1','groups':[],'user_permissions':[],'last_login_0':'','last_login_1':'','date_joined_0':'2019-03-06','date_joined_1':'13:00:00'}}

并使用<model-name>.delete(object_id: str)

删除对象
dynamic_client.users.delete('3')# {'response': <Response [200]>, 'success': True}dynamic_client.users.all()# {'response': <Response [200]>, 'ids': ['1', '2']}

三。生成特定的django管理python客户端

DjangoAdminDynamic对于快速终端会话非常有用。

当点击<tab>时,python解释器中提供了DjangoAdminDynamic客户端的自动完成,因为属性 在运行时使用内置的python函数对客户机进行内省。

但是用DjangoAdminDynamic编写源代码并不是那么令人愉快,因为 IDE无法知道在运行时对象将具有哪些属性。

为此,generate-package命令与django-admin-package一起提供。

示例

$ generate-package
Base url (including /admin): http://localhost:9000/admin
Superuser username: superuser
Superuser password:
Site name: fresh project
Path to package (default: /tmp): .
Version (default: 1.0):
Generated package in ./freshproject-admin-client

生成的项目结构:

$ tree freshproject-admin-client
freshproject-admin-client
├── freshproject_admin_client
│   ├── client.py
│   ├── __init__.py
│   └── spec.json
├── README.md
└── setup.py

1 directory, 5 files

您可以版本控制生成的包,安装它,上传到pypi。

生成的客户端的示例用法:

$ ipython
Python 3.6.7 (default, Nov  9 2018, 21:20:52)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from freshproject_admin_client import FreshProjectDjangoAdminClient

In [2]: client = FreshProjectDjangoAdminClient('http://localhost:9000/admin', 'superuser', 'why-dont-tell-mom?')

In [3]: client.auth.users.all()
Out[3]: {'response': <Response [200]>, 'ids': ['4', '1', '2']}

In [4]: client.auth.users.add()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-213c8509773c> in <module>
----> 1 client.auth.users.add()

TypeError: add() missing 3 required positional arguments: 'username', 'password1', and 'password2'

In [5]: client.auth.users.add('from_freshproject_client', '123qweASD)_+', '123qweASD)_+')
Out[5]: {'response': <Response [200]>, 'id': '5', 'created': True}

In [6]: client.auth.users.get('5')
Out[6]:
{'response': <Response [200]>,
 'details': {'username': 'from_freshproject_client',
  'password': '<N/A>',
  'first_name': '',
  'last_name': '',
  'email': '',
  'is_active': '',
  'is_staff': '',
  'is_superuser': '',
  'groups': [],
  'user_permissions': [],
  'last_login': '',
  'date_joined': '2019-03-05'}}

In [7]: client.auth.users.find('from_freshproject_client')
Out[7]: {'response': <Response [200]>, 'id': '5'}

In [8]: client.auth.users.delete('5')
Out[8]: {'response': <Response [200]>, 'success': True}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
SSLEngine中getHandShakeStatus()的握手差异和java中SSLenginResults的握手差异   java数据验证执行while循环   java使用GSON尽可能简单地解析JSON字符串   SpringJava。lang.NoClassDefFoundError:org/springframework/security/converter/RsaKeyConverters   java如何将列表<String>作为对象发送并使用ObjectInputStream读取   java从高速数据流更新映射   java从类路径获取目录(现在获取文件)   java如何减去两个字符串   为什么Java提供规范而不是实现   返回字符时出现的java问题   将MySQL数据库移动到远程服务器后php“拒绝用户访问”   对LinkedList进行java排序   JavaScript正则表达式到Java正则表达式   java JSF到JQuery组件的集成   java中图形的swing自定义方法。awt。图样   java将多个trycatch块组合成一个   java SFTP路径格式与本地路径格式