كيفية إنشاء -> التسجيل + تسجيل الدخول تطبيق الويب مع بيثون جانغو 2.0

نائمة

لقد كنت أستخدم Python منذ فترة طويلة في مساعي My Machine Learning and Web Crawling & Scraping ، فقد كنت مرتبكًا بين اختيار Flask أو Django لتطبيق ويب ، لكنني قررت استخدام الإطار الشعبي Django المستخدم في البرمجة النصية الخلفية في Python بسبب وظيفتها على نطاق أوسع مقارنة مع قارورة التبسيط. لقد استخدمت Ubuntu 16.04 للمشروع بالكامل ونفس الشيء عملت في نظام التشغيل Windows 10 x64 أيضًا ، لكن العملية نفسها هي نفسها في أي نظام تشغيل لأن Python و Django كلاهما أدوات متعددة المنصات. ما تستخدمه Django هو نموذج Model-Template-View (MTV) والذي يشبه تمامًا نمط MVC المستخدم على نطاق واسع في إنشاء تطبيقات الويب.

يتكون مشروع Django من أربعة ملفات Python رئيسية داخل شجرة المشروع وهي settings.py ، views.py ، urls.py ، models.py يتعامل ملف الإعدادات مع جميع إعدادات مشروع Django على مستوى النظام ، وملف عناوين url يخزن كل عنوان URL أنماط لمشروعنا التي تنبثق وتعيد التوجيه من صفحتنا الرئيسية. نقوم بتخزين نماذج البيانات الخاصة بنا بتنسيق Python Django في ملف النماذج الذي يتم ترجمته بعد ذلك إلى عمليات SQLite افتراضيًا في العملية دون أي حاجة واضحة إلى الكود. أخيرًا ، يكون ملف طرق العرض هو المكان الذي تتم فيه معالجة دالات الطلب والاستجابة ويتم عرض الصفحة. بالنسبة للملفات الأخرى واستخدامها ، تفضل بقراءة وثائق Django وقاموسها: https://docs.djangoproject.com/en/2.1/glossary/

يمكن تقسيم العملية برمتها من الصفر إلى إنشاء صفحة تسجيل وتسجيل الدخول باختصار إلى ثلاث خطوات بسيطة:

1> إنشاء هيكل المشروع

بادئ ذي بدء ، قم بتثبيت Python3 و pip على نظامك من مواقعهما ، ثم نستخدم شيئًا يسمى virtualenv لجعل مشروعنا مستدامًا محليًا وتغليفه واستخدامه
$ نقطة تثبيت virtualenv
يؤدي هذا إلى تثبيت بيئة افتراضية لتتمكن من تثبيت الحزم وتجربة دون الانتفاخ تثبيت نظام Python.
يمكننا أن نبدأ بجعل مجلد المشروع باستخدام
mkdir djangox
بعد ذلك نقوم بإنشاء virtualenv في djangox مجلد المشروع لدينا.
$ cd djangox && virtualenv denvx -p python3
أيضا تفعيل denvx
المصدر $ / denvx / بن / تفعيل
لتثبيت إطار عمل Django في برنامجنا (denvx) ، استخدم pip
$ نقطة تثبيت جانغو
نبدأ الآن باستخدام مشروع django الخاص بنا
django-admin startproject dprojx
أيضا جعل التطبيق django للتسجيل وتسجيل الدخول الصفحة مع
cd $ dprojx && django-admin startapp dappx
نقوم أيضًا بإنشاء مجلدات إضافية مثل "/ القوالب" و "/ الوسائط" و "/ ثابت" ... الآن
mkdir $ قوالب وسائط ثابتة / profile_pics قوالب / dappx
لدى Django الآن نماذج وطرق عرض تم إنشاؤها لتطبيقنا "dappx" والذي يجب أن يتم ترحيله لي والذي نستخدمه
ترحيل $ python manager.py
$ python manager.py makemigrations dappx
ترحيل $ python manager.py
يؤدي هذا إلى ترحيل التغييرات ونحن الآن على استعداد للبدء في الترميز وإنشاء جزء من المشروع

يجب أن يبدو هيكل المشروع الخاص بك الآن بالشكل التالي:

هيكل المشروع

2> تعديل ملفات المشروع

افتح dprojx / settings.py وأضف الأسطر الخاصة بـ _DIR الأخرى لتبدو كما يلي:

# dprojx / settings.py
# إنشاء مسارات داخل المشروع مثل هذا: os.path.join (BASE_DIR ، ...)
BASE_DIR = os.path.dirname (os.path.dirname (os.path.abspath (__ file__)))
TEMPLATE_DIR = os.path.join (BASE_DIR ، "قوالب")
STATIC_DIR = os.path.join (BASE_DIR ، 'ثابت')
MEDIA_DIR = os.path.join (BASE_DIR ، 'الوسائط')

أيضًا في قسم التطبيقات المثبتة ، يلزمك إضافة dappx حتى يتم التعرف عليه وتسجيله:

INSTALLED_APPS = [
    "django.contrib.admin،
    "django.contrib.auth،
    "django.contrib.contenttypes،
    "django.contrib.sessions،
    "django.contrib.messages،
    "django.contrib.staticfiles،
    "dappx،
]

أضف TEMPLATE_DIR إلى "DIRS": [] المقطع أيضًا:

قوالب = [
    {
        "الخلفية": "django.template.backends.django.DjangoTemplates" ،
        "DIRS": [TEMPLATE_DIR ،] ،
        "APP_DIRS": صحيح ،
        'خيارات': {
            "سياق_المعالجون": [
                "django.template.context_processors.debug،
                "django.template.context_processors.request،
                "django.contrib.auth.context_processors.auth،
                "django.contrib.messages.context_processors.messages،
            ]،
        }،
    }،
]

أضف هذه السطور في نهاية dprojx / settings.py لمجلد الاستاتيكات والقوالب ومجلدات الوسائط:

STATIC_URL = '/ ثابت /'
STATICFILES_DIRS = [STATIC_DIR،]
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = ‘/ media / '
LOGIN_URL = ‘/ dappx / user_login / '

بعد ذلك ، نقوم بإنشاء dappx / models.py ليتم استخدامه سيكون أساس النماذج الخاصة بنا.

# dappx / models.py
من نماذج استيراد django.db
من django.contrib.auth.models استيراد المستخدم
# إنشاء النماذج الخاصة بك هنا.
فئة UserProfileInfo (models.Model):
المستخدم = models.OneToOneField (مستخدم ، on_delete = models.CASCADE)
portfolio_site = models.URLField (blank = True)
profile_pic = models.ImageField (upload_to = 'profile_pics'، blank = True)
def __str __ (self):
  إرجاع self.user.username

من models.py نتحول الآن إلى dappx / forms.py:

# dappx / forms.py
من أشكال استيراد django
من dappx.models استيراد UserProfileInfo
من django.contrib.auth.models استيراد المستخدم
نموذج مستخدم فئة (forms.ModelForm):
    كلمة المرور = forms.CharField (عنصر واجهة المستخدم = forms.PasswordInput ())
    فئة التعريف ():
        نموذج = المستخدم
        الحقول = ('اسم المستخدم' ، 'كلمة المرور' ، 'البريد الإلكتروني')
فئة UserProfileInfoForm (forms.ModelForm):
     فئة التعريف ():
         نموذج = UserProfileInfo
         الحقول = ('Wallet_site' ، 'profile_pic')

سجل نماذجك في dappx / admin.py أيضًا:

# dappx / admin.py
من django.contrib استيراد المشرف
من dappx.models استيراد UserProfileInfo ، المستخدم
# تسجيل النماذج الخاصة بك هنا.
admin.site.register (UserProfileInfo)

يتم تشغيل العنصر الأكثر أهمية الآن حيث يتم إنشاء طريقة العرض الخاصة بنا لصفحات .html الخاصة بنا في dappx / views.py:

# dappx / views.py
من django.shortcuts تقديم الاستيراد
من dappx.forms استيراد UserForm ، UserProfileInfoForm
من django.contrib.auth استيراد المصادقة ، تسجيل الدخول ، تسجيل الخروج
من django.http استيراد HttpResponseRedirect ، HttpResponse
من django.urls استيراد عكس
من django.contrib.auth.decorators استيراد login_required
مؤشر def (الطلب):
    عرض الإرجاع (طلب ، 'dappx / index.html')
@تسجيل الدخول مطلوب
ديف الخاصة (طلب):
    إرجاع HttpResponse ("لقد قمت بتسجيل الدخول!")
@تسجيل الدخول مطلوب
def user_logout (طلب):
    الخروج (طلب)
    إرجاع HttpResponseRedirect (عكس ('الفهرس'))
سجل def (طلب):
    مسجل = خطأ
    إذا request.method == 'POST':
        user_form = UserForm (بيانات = request.POST)
        profile_form = UserProfileInfoForm (data = request.POST)
        إذا كان user_form.is_valid () و profile_form.is_valid ():
            المستخدم = user_form.save ()
            user.set_password (user.password)
            user.save ()
            profile = profile_form.save (الالتزام = خطأ)
            profile.user = المستخدم
            إذا "profile_pic" في request.FILES:
                طباعة ("وجدت")
                profile.profile_pic = request.FILES ['profile_pic']
            profile.save ()
            مسجل = صحيح
        آخر:
            طباعة (user_form.errors، profile_form.errors)
    آخر:
        user_form = UserForm ()
        profile_form = UserProfileInfoForm ()
    عرض الإرجاع (طلب ، 'dappx / registration.html' ،
                          { 'user_form': user_form،
                           "profile_form ': profile_form،
                           'مسجل': مسجل})
def user_login (طلب):
    إذا request.method == 'POST':
        اسم المستخدم = request.POST.get ('اسم المستخدم')
        كلمة المرور = request.POST.get ('كلمة المرور')
        المستخدم = المصادقة (اسم المستخدم = اسم المستخدم ، كلمة المرور = كلمة المرور)
        إذا كان المستخدم:
            إذا كان user.is_active:
                تسجيل الدخول (طلب، المستخدم)
                إرجاع HttpResponseRedirect (عكس ('الفهرس'))
            آخر:
                إرجاع HttpResponse ("كان حسابك غير نشط.")
        آخر:
            طباعة ("شخص ما حاول تسجيل الدخول وفشل".)
            طباعة ("لقد استخدموا اسم المستخدم: {} وكلمة المرور: {}". التنسيق (اسم المستخدم ، كلمة المرور))
            إرجاع HttpResponse ("تفاصيل تسجيل دخول غير صالحة معطى")
    آخر:
        عرض الإرجاع (طلب ، 'dappx / login.html' ، {})

يمكن الآن ترتيب القوالب لإنشاء المشاهدات ، ونحن نستخدم أربعة قوالب لهذا: ‘base.html، ،‘ registration.html ’،‘ login.html ’،‘ index.html ’:

base.html:



  <رئيس>
    
    <عنوان> قاعدة 
    
    
      
        
{# Django Home Link / Admin Link / Register Link #}
          
  • DJANGO
  •           
  • Admin
  •           
  • التسجيل
  •           {# بعض المنطق حول ما يتم عرضه للعنصر الأخير #}           {٪ if user.is_authenticated٪}             
  • تسجيل الخروج
  •           {٪ else٪}             
  • تسجيل الدخول
  •           {٪ إنهاء إذا ٪}
    
          
        
        
        {٪ block body_block٪}     {٪ endblock٪}        

    index.html:

    {٪ يمتد "dappx / base.html"٪}
    {٪ block body_block٪}
      
        

    مرحبًا بك في Djungle!

        {٪ if user.is_authenticated٪}         

    مرحبًا {{user.username}}

        {٪ else٪}         

    التسجيل أو تسجيل الدخول إذا كنت ترغب في ذلك     {٪ إنهاء إذا ٪}   

    {٪ endblock٪}

    login.html:

    {٪ يمتد 'dappx / base.html'٪}
    {٪ block body_block٪}
      
        
          

    تسجيل الدخول هنا:

              {٪ csrf_token٪}           {# طريقة "HTML" أخرى لإنشاء نموذج تسجيل الدخول #}                      
    
              
    <إدخال نوع = "إرسال" name = "" value = "تسجيل الدخول">
    
      
    {٪ endblock٪}

    Registration.html:

    {٪ يمتد "dappx / base.html"٪}
    {٪ load staticfiles٪}
    {٪ block body_block٪}
      
        
          {٪ إذا سجلت٪}         

    شكرًا لك على التسجيل!       {٪ else٪}         

    سجل هنا         

    فقط املأ النموذج.

    
              {٪ csrf_token٪}
              {{user_form.as_p}}
              {{profile_form.as_p}}
              
            
            
          {٪ إنهاء إذا ٪}
        
      
    {٪ endblock٪}

    بعد ذلك ، نسجِّل عناوين url أعلاه في ملفات urls.py الخاصة بمشروعنا لإنشاء ملف

    # dappx / urls.py
    من django.conf.urls استيراد عنوان url
    من وجهات نظر استيراد dappx
    # تعيين مساحة!
    app_name = 'dappx'
    # كن حذرا في تحديد اسم فقط / تسجيل الدخول استخدام userlogin بدلا من ذلك!
    urlpatterns = [
        رابط (ص '^ السجل / $'، views.register، اسم = 'التسجيل')،
        رابط (ص '^ USER_LOGIN / $'، views.user_login، اسم = 'USER_LOGIN')،
    ]

    في ملف urls.py الرئيسي ، يتم تحديد بقية النموذج:

    # dprojx / urls.py
    من django.contrib استيراد المشرف
    من django.urls مسار الاستيراد
    من django.conf.urls استيراد رابط ، وتشمل
    من وجهات نظر استيراد dappx
    urlpatterns = [
        المسار ('admin /' ، admin.site.urls) ،
        رابط (ص '^ $'، views.index، 'مؤشر' اسم =)،
        رابط (ص '^ خاص /'، views.special، اسم = 'الخاصة')،
        رابط (ص '^ dappx /'، وتشمل ( 'dappx.urls'))،
        url (r '^ logout / $'، views.user_logout، name = 'logout')،
    ]

    الآن يجب أن يبدو هيكل المشروع كما يلي:

    شجرة المشروع

    مرة أخرى طبّق الهجرات باستخدام:

    ترحيل $ python manager.py
    $ python manager.py makemigrations dappx
    ترحيل $ python manager.py

    وإنشاء مستخدم خارق (مسؤول عن المشروع بشكل أساسي) باستخدام الأمر:

    بيثون $

    أدخل اسم المستخدم المطلوب ، البريد الإلكتروني وكلمة المرور.

    3> إطلاق النار حتى الخادم!

    أنت الآن جاهز لبدء تشغيل الخادم الخاص بك:

    $ بيثون
    إجراء اختبارات النظام ...
    تحديد نظام تحديد أي مشاكل (0 إسكات).
    18 يوليو ، 2018 - 04:03:03
    إصدار Django 2.0.7 ، باستخدام الإعدادات "dprojx.settings"
    بدء تشغيل خادم التطوير على http://127.0.0.1:8000/
    قم بإنهاء الخادم باستخدام CONTROL-C.

    هناك لدينا!

    انتقل إلى http://127.0.0.1:8000/ لرؤية موقع Django الذي يعمل بالطاقة.

    صفحة الترحيب

    فيما يلي صفحات تسجيل الدخول والتسجيل:

    صفحة التسجيلصفحة تسجيل الدخول

    تحرير (01 | 04 | 19):

    بالنسبة لبعضكم ممن يسألون عن خطأ مثل ModelForm ، لا يوجد لديه نموذج محدد. كان هذا الخطأ بسبب خطأ في المسافة البادئة أثناء نسخ الشفرة إلى المحرر ويمكن حلها عن طريق الانتقال إلى إعدادات المسافة البادئة واستبدال جميع علامات التبويب بأربعة مسافات أو العكس. تذكر أيضًا أن Django و Python حساسان لحالة الأحرف ، لذا فقد تم تصميم الطراز والطراز المختلف. إذا استمر الخطأ ، فحاول البحث عن خطأ المسافة البادئة في الملف والخط المحدد وقم بتصحيحه يدويًا كما أشار YooYoung Ko. في صحتك

    أراك في مقالتي القادمة!

    آمل أن تكون قد ساعدتكم أول وظيفة متوسطة ، أتطلع إلى تقديم المزيد من هذه الأدلة الإرشادية والبسيطة والعملية التي يمكن أن تجعل عملية علوم الكمبيوتر بأكملها أكثر حيوية وعقلانية للجميع.

    إذا وجدت هذا مفيدًا وغني بالمعلومات ، فيرجى إخبارنا بالتصفيق أو التعليق! أيضًا عن أي استفسارات قد تكون لديكم فيما يتعلق بما سبق ، اسألني عن طريق التعليق أو تغريداتhimanshuxd