XUNDD X49 Открытый чехол Беспроводные наушники Bluetooth 5.3 с сенсорным управлением для дома / уличного использования - Синий
【Простое подключение】Откройте чехол, чтобы мгновенно подключиться и слушать, устраняя утомительные процедуры настройки для более удобного пользовательского опыта
【Комфортный дизайн】Благодаря внутриканальному дизайну, повторяющему естественный изгиб ушного канала, эти наушники обеспечивают устойчивую посадку, которая не склонна к выпадению
【Увеличенное время автономной работы】С полностью модернизированной емкостью аккумулятора 200 мАч в зарядном чехле и 25 мАч в каждом наушнике, наслаждайтесь более длительными сеансами прослушивания без частой подзарядки
【Усовершенствованный Bluetooth 5.3】Отличная помехоустойчивость и снижение потребления энергии обеспечивают стабильную передачу данных для непрерывного наслаждения аудио
【Сенсорное управление】Чувствительные сенсорные элементы управления позволяют легко управлять воспроизведением музыки, вызовами и активацией голосового ассистента кончиками пальцев
【Защитный силиконовый чехол】Включает мягкий силиконовый чехол для защиты наушников от случайных падений и ударов
Характеристики:
Модель: X49
Материал: ABS
Версия Bluetooth: 5.3
Емкость аккумулятора зарядного чехла: 200 мАч
Емкость аккумулятора наушников: 25 мАч каждый
Дизайн: Откр
{
"title": "added a parameter to the function to allow the user to specify the min\u2026",
"url": "https://github.com/LukasRychtecky/django-password-generator/pull/5",
"author_login": "LukasRychtecky",
"type": "pr_timeline"
}
{
"type": "file",
"path": "README.md"
}
1 # django-password-generator
2
3 [](https://travis-ci.org/LukasRychtecky/django-password-generator)
4
5 A simple Django password generator.
6
7 ## Installation
8
9 Install the package from PyPI:
10
11 ```
12 pip install django-password-generator
13 ```
14
15 ## Usage
16
17 Add `password_generator` to your Django `INSTALLED_APPS`:
18
19 ```python
20 INSTALLED_APPS = [
21 ...
22 'password_generator',
23 ]
24 ```
25
26 Add the URL patterns to your Django `urls.py`:
27
28 ```python
29 urlpatterns = [
30 ...
31 url(r'^password-generator/', include('password_generator.urls')),
32 ]
33 ```
34
35 Generate a password:
36
37 ```python
38 from password_generator.generator import generate_password
39
40 password = generate_password()
41 print(password) # EUgIhx@7
42 ```
43
44 ## Configuration
45
46 You can configure the password generator by overriding the following settings in your Django `settings.py`:
47
48 ```python
49 PASSWORD_GENERATOR_LENGTH = 8 # The length of the generated password
50 PASSWORD_GENERATOR_INCLUDE_DIGITS = True # Include digits in the password
51 PASSWORD_GENERATOR_INCLUDE_UPPERCASE = True # Include uppercase letters in the password
52 PASSWORD_GENERATOR_INCLUDE_LOWERCASE = True # Include lowercase letters in the password
53 PASSWORD_GENERATOR_INCLUDE_SPECIAL_CHARS = True # Include special characters in the password
54 PASSWORD_GENERATOR_SPECIAL_CHARS = '!@#$%^&*()_+=-[]{}|;:,.<>?' # The set of special characters to include
55 ```
56
57 ## Testing
58
59 To run the tests, execute the following command:
60
61 ```
62 python manage.py test password_generator
63 ```
64
{
"type": "file",
"path": "password_generator/generator.py"
}
1 import random
2 import string
3
4 from django.conf import settings
5
6
7 def generate_password():
8 """
9 Generates a password based on the settings.
10
11 :return: The generated password.
12 """
13 length = getattr(settings, 'PASSWORD_GENERATOR_LENGTH', 8)
14 include_digits = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_DIGITS', True)
15 include_uppercase = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_UPPERCASE', True)
16 include_lowercase = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_LOWERCASE', True)
17 include_special_chars = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_SPECIAL_CHARS', True)
18 special_chars = getattr(settings, 'PASSWORD_GENERATOR_SPECIAL_CHARS', '!@#$%^&*()_+=-[]{}|;:,.<>?')
19
20 charset = ''
21 if include_digits:
22 charset += string.digits
23 if include_uppercase:
24 charset += string.ascii_uppercase
25 if include_lowercase:
26 charset += string.ascii_lowercase
27 if include_special_chars:
28 charset += special_chars
29
30 password = ''.join(random.choice(charset) for i in range(length))
31 return password
32
{
"path": "password_generator/tests.py",
"type": "file"
}
1 from django.test import SimpleTestCase
2 from django.test.utils import override_settings
3
4 from password_generator.generator import generate_password
5
6
7 class PasswordGeneratorTestCase(SimpleTestCase):
8 """
9 Tests for the password generator.
10 """
11
12 def test_generate_password(self):
13 """
14 Tests the `generate_password` function.
15 """
16 password = generate_password()
17 self.assertEqual(len(password), 8)
18 self.assertTrue(any(char.isdigit() for char in password))
19 self.assertTrue(any(char.isupper() for char in password))
20 self.assertTrue(any(char.islower() for char in password))
21 self.assertTrue(any(char in '!@#$%^&*()_+=-[]{}|;:,.<>?' for char in password))
22
23 @override_settings(PASSWORD_GENERATOR_LENGTH=12)
24 def test_generate_password_with_custom_length(self):
25 """
26 Tests the `generate_password` function with a custom length.
27 """
28 password = generate_password()
29 self.assertEqual(len(password), 12)
30
31 @override_settings(PASSWORD_GENERATOR_INCLUDE_DIGITS=False)
32 def test_generate_password_without_digits(self):
33 """
34 Tests the `generate_password` function without digits.
35 """
36 password = generate_password()
37 self.assertFalse(any(char.isdigit() for char in password))
38
39 @override_settings(PASSWORD_GENERATOR_INCLUDE_UPPERCASE=False)
40 def test_generate_password_without_uppercase(self):
41 """
42 Tests the `generate_password` function without uppercase letters.
43 """
44 password = generate_password()
45 self.assertFalse(any(char.isupper() for char in password))
46
47 @override_settings(PASSWORD_GENERATOR_INCLUDE_LOWERCASE=False)
48 def test_generate_password_without_lowercase(self):
49 """
50 Tests the `generate_password` function without lowercase letters.
51 """
52 password = generate_password()
53 self.assertFalse(any(char.islower() for char in password))
54
55 @override_settings(PASSWORD_GENERATOR_INCLUDE_SPECIAL_CHARS=False)
56 def test_generate_password_without_special_chars(self):
57 """
58 Tests the `generate_password` function without special characters.
59 """
60 password = generate_password()
61 self.assertFalse(any(char in '!@#$%^&*()_+=-[]{}|;:,.<>?' for char in password))
62
63 @override_settings(PASSWORD_GENERATOR_SPECIAL_CHARS='!@#$')
64 def test_generate_password_with_custom_special_chars(self):
65 """
66 Tests the `generate_password` function with custom special characters.
67 """
68 password = generate_password()
69 self.assertTrue(any(char in '!@#$' for char in password))
70 self.assertFalse(any(char in '%^&*()_+=-[]{}|;:,.<>?' for char in password))
71
{
"author_login": "LukasRychtecky",
"created_at": "2020-10-05 18:41:41",
"type": "issue_comment"
}
… and max length of the password
Author: Lukas Rychtecky
Date: Mon Oct 5 20:41:13 2020 +0200
added a parameter to the function to allow the user to specify the min and max length of the password
diff --git a/README.md b/README.md
index 7d1a4d2..3d5f338 100644
--- a/README.md
+++ b/README.md
@@ -37,8 +37,8 @@ Generate a password:
```python
from password_generator.generator import generate_password
-password = generate_password()
-print(password) # EUgIhx@7
+password = generate_password(min_length=8, max_length=12)
+print(password) # EUgIhx@7Ld2
```
## Configuration
diff --git a/password_generator/generator.py b/password_generator/generator.py
index 0f8d3f9..e2ed3f1 100644
--- a/password_generator/generator.py
+++ b/password_generator/generator.py
@@ -4,13 +4,15 @@ import string
from django.conf import settings
-def generate_password():
+def generate_password(min_length=None, max_length=None):
"""
Generates a password based on the settings.
+ :param min_length: The minimum length of the password.
+ :param max_length: The maximum length of the password.
:return: The generated password.
"""
- length = getattr(settings, 'PASSWORD_GENERATOR_LENGTH', 8)
+ length = random.randint(min_length or getattr(settings, 'PASSWORD_GENERATOR_LENGTH', 8),
+ max_length or getattr(settings, 'PASSWORD_GENERATOR_LENGTH', 8))
include_digits = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_DIGITS', True)
include_uppercase = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_UPPERCASE', True)
include_lowercase = getattr(settings, 'PASSWORD_GENERATOR_INCLUDE_LOWERCASE', True)
diff --git a/password_generator/tests.py b/password_generator/tests.py
index 9d7a95e..b243f8b 100644
--- a/password_generator/tests.py
+++ b/password_generator/tests.py
@@ -13,7 +13,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function.
"""
- password = generate_password()
+ password = generate_password(min_length=8, max_length=8)
self.assertEqual(len(password), 8)
self.assertTrue(any(char.isdigit() for char in password))
self.assertTrue(any(char.isupper() for char in password))
@@ -25,7 +25,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function with a custom length.
"""
- password = generate_password()
+ password = generate_password(min_length=12, max_length=12)
self.assertEqual(len(password), 12)
@override_settings(PASSWORD_GENERATOR_INCLUDE_DIGITS=False)
@@ -33,7 +33,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function without digits.
"""
- password = generate_password()
+ password = generate_password(min_length=8, max_length=8)
self.assertFalse(any(char.isdigit() for char in password))
@override_settings(PASSWORD_GENERATOR_INCLUDE_UPPERCASE=False)
@@ -41,7 +41,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function without uppercase letters.
"""
- password = generate_password()
+ password = generate_password(min_length=8, max_length=8)
self.assertFalse(any(char.isupper() for char in password))
@override_settings(PASSWORD_GENERATOR_INCLUDE_LOWERCASE=False)
@@ -49,7 +49,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function without lowercase letters.
"""
- password = generate_password()
+ password = generate_password(min_length=8, max_length=8)
self.assertFalse(any(char.islower() for char in password))
@override_settings(PASSWORD_GENERATOR_INCLUDE_SPECIAL_CHARS=False)
@@ -57,7 +57,7 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function without special characters.
"""
- password = generate_password()
+ password = generate_password(min_length=8, max_length=8)
self.assertFalse(any(char in '!@#$%^&*()_+=-[]{}|;:,.<>?' for char in password))
@override_settings(PASSWORD_GENERATOR_SPECIAL_CHARS='!@#$')
@@ -65,6 +65,6 @@ class PasswordGeneratorTestCase(SimpleTestCase):
"""
Tests the `generate_password` function with custom special characters.
"""
- password = generate_password()
Технические характеристики
Общее
Вес посылки
Отзывы
Сравнение цен
Добавить в список желаний
оптовых
Настройка
XUNDD X49 Открытый чехол Беспроводные наушники Bluetooth 5.3 с сенсорным управлением для дома / уличного использования - Синий
Артикул: 6812002464B
бренд: XUNDD
Та же модель в других Цветs:
Итого:
Сохранить
Оцененная стоимость доставки: --Дополнительные варианты доставки