این سایت از کوکی استفاده می کند. ادامه مرور در این سایت به منزله این است که با استفاده کوکی ها توسط ما موافقت کرده اید.

 

خوش آمدید به انجمن تخصصی پایتون و جنگو (پایتونی ها)

لطفاً برای دسترسی به تمامی بخش های سایت مراحل ثبت نام و ایجاد حساب کاربری را طی نمایید.

جستجو در تالار: در حال نمایش نتایج برای برچسب های 'آموزش پروژه محور جنگو'.



تنظیمات بیشتر جستجو

  • جستجو بر اساس برچسب

    برچسب ها را با , از یکدیگر جدا نمایید.
  • جستجو بر اساس نویسنده

نوع محتوا


تالار ها

  • پایتون ( Python )
    • تالار پایتون مقدماتی
    • تالار پایتون پیشرفته
    • تالار تفاوت زبان پایتون ورژن ۲ و ۳
  • جنگو ( django )
    • تالار جنگو مقدماتی
    • تالار جنگو پیشرفته
    • تالار کتاب جنگو ( جنگو بوک )
    • تالار آموزش پروژه محور جنگو
  • آموزش تکه کدهای کاربردی پایتون ( Python Code Snippet )
  • دریافت نسخه های پایتون
    • نرم افزار زبان برنامه نویسی پایتون
  • دریافت افزونه های پایتون
    • اجرای اسکریپتهای پایتون در اندروید
  • رفع مشكلات برنامه های پايتون
  • معرفی برنامه های تحت پايتون
  • بخش بایگانی

وبلاگ‌ها

  • مقایسه Python با هشت زبان برنامه نویسی مطرح جهان

دسته ها

  • مقاله های سایت

دسته ها

  • دانلود نرم افزار زبان برنامه نویسی پایتون
  • دریافت افزونه های پایتون
    • اجرای اسکریپتهای پایتون در اندروید
  • کتاب های آموزشی پایتون ( Python )
  • کتاب های آموزش فریم ورک جنگو ( Django )

دسته ها

  • آموزش پایتون
    • آموزش پایتون مقدماتی
    • آموزش پایتون پیشرفته
    • تفاوت های پایتون ۲ و پایتون ۳
  • آموزش جنگو
    • آموزش جنگو مقدماتی
    • آموزش جنگو پیشرفته
    • آموزش پروژه محور جنگو
  • تکه کدهای کاربردی پایتون ( Python Code Snippet )
  • آموزش گیت
    • گیت لب ( GitLab )
    • گیت هاب ( GitHub )

18 نتیجه پیدا شد

  1. با عرض سلام خدمت پایتونی های عزیز . امیدوارم موفق و پیروز باشید . در قسمت چهارم از سری آموزش پروژه محور طراحی وبلاگ ساده با جنگو در خدمت شما هستیم . اگر مایل به دیدن آموزش های پروژه محور جنگو هستید به این لینک مراجعه کنید . در قسمت چهارم به نحوه ایجاد دیتابیس و اتصال اون به پنل مدیریت جنگو می پردازیم . ساخت یک وبلاگ ساده با جنگو پایگاه داده ( دیتابیس ) پایه و اساس بسیاری از برنامه های وب است و برنامه جانگو نیز جزو همین خانواده حساب می شود . در این قسمت از آموزش، تنظیمات پایگاه داده را پیکربندی کرده و بعد از اون از پنل مدیریت Django برای همگام سازی پایگاه داده با مدلی که در جلسه قبل ساختیم ، استفاده می کنیم . همانطور که در آموزش فایل settings.py در جنگو گفتیم ، تنظیمات مربوط به دیتابیس های ما در این فایل انجام خواهد گرفت . فراموش نکنید که قرار شد ما خیلی بحث رو سخت نکنیم و فعلا ابتدایی ترین آموزش هارو برای شما دوستان فراهم کنیم . خب فایل settings.py رو با ویراشگرتون باز کنید . در این فایل باید به سراغ دیکشنری DATABASE بریم : خب همانطور که می بینید ما در اینجا از دیتابیس sqlite استفاده کردیم و در خط NAME بهش دیتابیس پروژه رو معرفی کردیم . شما می توانید از نام دیگری استفاده کنید . ولی به صورت پیش فرض می تونید بهش دست نزنید . همین برای شناسوندن دیتابیس به پروژه کافیست . البته از دیتابیس sqlite بیشتر برای آموزش استفاده می شه . بعدها که پروژه های بزرگتر و تجاری انجام دادیم ، خواهید دید که به سراغ دیتابیس Mysql یا PostgreSQL خواهیم رفت . حالا که تنظیمات پایگاه داده پیکربندی شده است می تونید پایگاه داده خودتون رو ایجاد کنید. از اونجایی که شما برای اولین بار این کار را انجام می دید، از شما خواسته می شه که یک حساب کاربری مدیریت که در بخش بعدی مورد استفاده قرار می گیره ، ایجاد کنید. به ترمینال برید و کد زیر رو بزنید : python manage.py syncdb حالا بعد از زدن این دستور به روت پروژه تون مراجعه کنید ، می بینید که فایلی با نام db.sqlite3 ایجاد شده که این فایل دیتا بیس پروژه شماست و اطلاعات شما از قبیل : صفحات و پست ها و کاربران و ... بر روی این فایل ذخیره خواهد شد . پس خیلی مواظب این فایل باشید ! ساخت اکانت مدیر برای پنل مدیریت جنگو جنگو به صورت پیش فرض صفحه مدیریت دارد . اگر به جلسه قبلی رجوع کنید خواهید دید زمانی که ما مدل App بلاگ خودمون رو ایجاد کردیم ... هنگام ایجاد چندتا App‌ دیگه هم به صورت پیش فرض ایجاد شدن که یکی از اونها Admin بود ... برای دسترسی به این صفحه به مرورگر خودتون مراجعه کنید و آدرس زیر رو بزنید تا صفحه ورود به مدیریت رو مشاهده کنید : localhost:8000/admin خب باید با صحنه زیر مواجه بشید : خب برای ورود شما احتیاج به یک اکانت مدیریتی دارید . ترمینال خودتون رو باز کنید و دستور زیر رو وارد کنید . بعد از دستور زیر از شما ایمیل و پسورد میخواد . هر چیزی که دوست دارید وارد کنید ولی فراموشش نکنید . این اکانت مدیریت پروژه شماست . python manage.py createsuperuser طبق مراحل زیر عمل کنید : خب شما موفق شدید اکانت مدیریت برای پروژه خودتون ایجاد کنید . حالا با یوزر نیم admin و پسوردی که ایجاد کردید وارد پنل مدیریت پروژه خودتون بشید . من زیاد موارد داخل پنل مدیریت رو توضیح نمیدم . میتونید از لینک های زیر برای آموزش های بیشتر استفاده کنید : آموزش ایجاد پنل مدیریت در جنگو ( جلسه ششم ) - بخش اول آموزش ایجاد پنل مدیریت در جنگو ( جلسه ششم ) - بخش دوم خب همانطور که می بینید تونستیم دیتابیس پروژه مون رو ایجاد کنیم و بعد به پنل مدیریت پیش فرض جنگو هم دسترسی پیدا کنیم . خیلی خب . شما تا اینجا رو کمی تمرین کنید و کمی با پنل مدیریت جنگو دست و پنجه نرم کنید و بعد به سراغ قسمت بعدی آموزش برید . اگر سوالی یا مشکلی درباره این آموزش داشتید در بخش تاپیک پشتیبانی این آموزش مطرح کنید تا دوستان شما به شما پاسخ بدن . خسته نباشید . جلسه پنجم از سری آموزش پروژه محور ساخت یک وبلاگ ساده با جنگو به پایان رسید . موفق و پیروز باشید پایتونی ها
  2. این تاپیک پشتیبانی برای آموزش است ساخت یک وبلاگ ساده با جنگو ( قسمت پنجم ) 02/07/96 16:10 02/07/96 16:10 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  3. با سلام من ی هاست با پشتیبانی پایتون گرفتم. پروژه و app جنگو رو هم میسازم اما واقعا دیگه نمیدونم چیکار کنم که بتونم app جنگو(حتی "it werked!" ساده) را هم اجرا کنم. ممنون میشم اگر راهنماییم کنید.
  4. با عرض سلام خدمت پایتونی های عزیز . امیدوارم موفق و پیروز باشید . در قسمت چهارم از سری آموزش پروژه محور آموزش طراحی وبلاگ ساده با جنگو در خدمت شما هستیم . اگر مایل به دیدن آموزش های پروژه محور جنگو هستید به این لینک مراجعه کنید . در قسمت چهارم که یکی از مهمترین بخش های طراحی سایت با جنگوست ، به تعریف مدل برای وبلاگمون می پردازیم . ما میخوایم با این مدل ، دیتابیس مربوط به App وبلاگ رو ایجاد کنیم تا اطلاعات این App بر روی اون ذخیره بشه . نوشتن مدل مربوط به App وبلاگ برای طراحی سایت با جنگو البته در شروع کار نیازی نیست که ما خیلی خودمون رو درگیر دیتابیس های مختلف نظیر SQL و ... کنیم . اصلا لازم نیست شما کلی کد SQL شروع کنید به نوشتن . ما فقط مدل مناسب با خواسته مون رو مینویسم . وظیفه این مدل ها ایجاد جدول های مناسب در دیتابیس هست تا اطلاعات بر روی این جدول ها ذخیره بشن و هر وقت ما به هر بخشی از این جداول احتیاجی داشتیم ، با زدن کوئری مناسب ، به اون اطلاعات دسترسی پیدا می کنیم . خب برای شروع شما به فایل models.py در App‌ بلاگ خودتون برید . ( دقت کنید که یک همچین فایلی هم در روت اصلی پروژه هست ، فعلا منظور ما فایل مدل App بلاگ هست ) خب حالا کدهای زیر رو داخل این فایل کپی کنید : from django.db import models class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) description = models.CharField(max_length=255) content = models.TextField() created = models.DateTimeField(auto_now_add=True) این کدها چیکار می کنند ؟ خط اول این کد ، داره از django.db ایمپورت میکنه models رو که بتونیم از مدل استفاده کنیم . در خط بعدی یک کلاس ایجاد کردیم با نام پست . همانطور که از نامش پیداست مربوط به نوشته ها هست . وقتی که ما میخوایم داخل وبلاگ نوشته ایجاد کنیم احتیاج به یک بستر دیتابیس داریم . الان در حال ایجاد کردن این بستر هستیم . دقت کنید که نام اول کلاس باید با حروف بزرگ نوشته شود و اینکه چه نامی بزاریم مهم نیست . فقط سعی کنید که مرتبط انتخاب کنید . خب در ۶ خط بعدی ما دستور دادیم که ۶ سطر برای جدولمون تو دیتابیس ایجاد بشه . این سطر ها بر اساس نیاز App‌ شما ایجاد میشن . این تعداد چیز ثابتی نیست . شما می توانید کمتر یا بیشتر سطر و جدول ایجاد کنید البته متناسب با نیازتون . Title = در جدول Post ما احتیاج به سطری داریم که نام نوشته ها ( عنوان نوشته ها ) مون در اون ذخیره بشن . چون قطعا هر نوشته یک نام داره . نوع این جدول رو هم CharField انتخاب کردیم چون نام نوشته ما استرینگ هست . یعنی از حروف و یا اعداد قرار تشکیل بشه . ماکزیمم تعداد رو هم ۲۵۵ در نظر گرفتیم . Slug = هر نوشته ما به تگ احتیاج داره . این تگ ها در امر سئو و جستجو و ... در سایت بسیار با اهمیت هستند . نوع این سطر از جدول دیتابیس مون رو SlugField انتخاب کردیم . سپس مشخص کردیم که حتما حتما باید به صورت یونیک و منحصر به فرد باشه ( یعنی تگ تکراری نداریم ) و ماکزیمم تعداد اون هم ۲۵۵ باشه . Description = هر نوشته ما احتمالا توضیحات داره . به بالای همین آموزش رجوع کنید خواهید دید که در یک باکس به صورت مختصر راجب این آموزش یک توضیح یک خطی نوشته شده . پس برای این هم یک سطر ایجاد می کنیم . مثل تایتل Content = خب بخش اصلی جدول ما همین کانتنت هست . همون بدنه نوشته ما . متن اصلی نوشته . براش یک سطر ایجاد کردیم و نوع اون رو TextField در نظر گرفتیم چون قرار هست نوشته در اون قرار بگیره . ماکزیمم مقدار اون هم روی ۲۵۵ ست کردیم . Created = فیلد بعدی مربوط به تاریخ ایجاد نوشته هست . ما احتیاج داریم که هر زمانی یک نوشته در وبلاگ ما ایجاد میشه ، تاریخ اون ثبت بشه . چون قطعا بهش نیاز پیدا میکنیم . برای همین این سطر رو در جدولمون ایجاد کردیم از نوع DateTimeField که تاریخ و زمان رو برای ما ثبت کنه . مقدار auto_now_add=True باعث میشه که همیشه از تاریخ فعلی هنگام ذخیره شدن به صورت خودکار استفاده کنه . خب بسیار عالی . شما تونستید مدل مربوط به وبلاگ خودتون رو درست کنید به کمک فیلدها و خواص آنها . حالا کدهای زیر رو به ترتیب داخل ترمینال وارد کنید تا تغییرات شما در دیتابیس ایجاد و ذخیره شوند : $ python manage.py makemigrations $ python manage.py migrate اگر مسیر رو طبق آموزش پیش اومده باشید باید با تصویر زیر روبرو بشید : خب همانطور که میبینید علاوه بر جدول مربوط به App بلاگ ، تغییرات مربوط به اپ های پیش فرض جنگو نیز در دیتابیس ایجاد و ثبت شدن . خیلی خب . شما تقریبا به صورت خیلی ساده یاد گرفتید که چطوری باید برای App های پروژه تون دیتابیس درست کنید . اگر سوالی یا مشکلی درباره این آموزش داشتید در بخش تاپیک پشتیبانی این آموزش مطرح کنید تا دوستان شما به شما پاسخ بدن . خسته نباشید . جلسه چهارم از سری آموزش پروژه محور ساخت یک وبلاگ ساده با جنگو به پایان رسید . موفق و پیروز باشید پایتونی ها
  5. این تاپیک پشتیبانی برای آموزش است ساخت یک وبلاگ ساده با جنگو ( قسمت چهارم ) 08/06/96 17:13 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  6. با عرض سلام و خسته نباشید به انجمن تخصصی پایتون و جنگو ( پایتونی ها ) خوش آمدید . با قسمت سوم از سری آموزش ساخت وبلاگ ساده با جنگو در خدمت شما دوستان عزیز هستیم . اگر میخواید به آموزش های پروژه محور جنگو دیگری دسترسی داشته باشید از این لینک میتونید به بخش مربوط مراجعه کنید . در قسمت اول و دوم به شما عزیزان یاد دادیم که ابتدا چطوری بستر مورد نیاز برای پروژه جنگویی خودتون رو آماده کنید و بعد پروژه pythonyha رو ایجاد کردیم . توجه کنید که مثلا در این آموزش pythonyha اسم سایت مورد نظر ماست که قراره یک وبلاگ داشته باشه . ساخت یک پروژه برای وبلاگ جنگویی خب دوستان عزیز . در جلسه قبل ما صفحه اول سایت خودمون رو هم دیدیم . ولی در اصل این پروژه خالی هست و هیچی نداره . فقط یک پروژه ایجاد شده تا الان . خب برای ادامه کار باید چیکار کنیم ؟ در طراحی سایت با پایتون و جنگو ، شما وقتی پروژه رو ایجاد می کنید یعنی چارچوب اصلی برای طراحی آماده شده . حالا باید بخش های مختلف سایت رو ایجاد کنید . یعنی چی؟ مثلا شما میخواید بخش ثبت نام برای سایت ایجاد کنید . پس باید یک App برای این کار ایجاد کنید و تمام کارهارو بر روی اون انجام دهید . مثلا شما میخواید یک وبلاگ هم داشته باشه سایتی که دارین طراحی می کنید . پس باید یک App هم برای این کار مثلا با نام blog ایجاد کنید . پس فکر کنم تقریبا متوجه شدید . برای هر بخشی که قرار تو سایت ایجاد بشه مثل فروشگاه ، وبلاگ ، سیستم ثبت نام و ورود کاربر و ... باید برای خودش یک App‌ داشته باشه . البته بهتره که اینطوری باشه تا همه چی مجزا و مرتب باشه و بعدا برای توسعه سایت جنگو به مشکل نخورید . این سری آموزشی که شما در حال مطالعه اون هستید یک وبلاگ خیلی خیلی ساده هست که هیچ بخش خاصی نداره و فقط برای آشنایی شما عزیزان با ایجاد سایت با جنگو هست . یعنی در اصل ما فقط یک App خواهیم داشت با نام blog و یا هرچیز دیگه ای . ایجاد App بلاگ برای پروژه جنگو خب بریم سراغ کار . اگر جلسات رو پشت سر هم دیدید که الان تو دایرکتوری پروژه باید باشید و اگر که از پروژه خارج شدید ، با دستورات زیر دوباره خودتون رو آماده کنید برای ایجاد اپ جنگو : $ cd pythonyha $ source .env/bin/activate $ cd pythonyha وقتی وارد دایرکتوری پروژه شدید ( یعنی جایی که فایل manage.py‌ وجود داره ) ، با کمک دستور زیر اولین App جنگویی خودمون رو میسازیم . این دستور ثابت هست و هر موقع خواستید App بسازید باید در دایرکتوری پروژه قرار بگیرید و این دستور رو بزنید: $ django-admin.py startapp blog خب فکر کنم ظاهر کد خیلی واضح هست و نیازی به توضیح زیادی نداره . بجای اسم blog شما هر اسمی میتونید برای App خودتون بزارید . مهم نیست . فقط طوری اسم انتخاب کنید که کوتاه باشد و مربوط به بخشی که میخواید در سایت ایجاد کنید . خب بعد زدن این دستور با دستور cd pythonyha وارد پروژه اصلی شده و یک نگاهی به فولدر پروژه مون می اندازیم : بله . مشاهده می کنید که یک فولدر ایجاد شده در کنار فولدر پروژه مون به نام blog . پس از این به بعد هر تعداد App درست کنید ، در دایرکتوری اصلی در کنار پوشه pythonyha که پروژه اصلی ماست ، ایجاد خواهند شد . وارد پوشه اپ وبلاگ شوید : در پوشه اپ یکسری فایل و فولدر مشاهده می کنید که کم کم با این ها آشنا خواهید شد . شاید در این سری آموزش خیلی وارد جزئیات نشیم ولی سری آموزش های پروژه محور جنگو رو اگر دنبال کنید کاملا به تمامی موارد مسلط خواهید شد : فایل __init__.py : داخل این فایل به صورت پیش فرض خالیست . ولی یکی از فایل های مهم در پروژه جنگو ماست . شاید تو این آموزش ازش استفاده نکنیم . فایل models.py : در این فایل مدل App‌ خودمون رو تعریف میکنیم تا بتونیم دیتابیس مورد نیازمون رو بسازیم . فایل views.py : در این فایل تمام توابعی که مسئولیت ارتباط دیتابیس و صفحه ای کاربر مشاهده میکنه رو به عهده دارند رو خواهیم نوشت . فایل test.py : برای تست و آزمایش ازش استفاده میکنیم . انشاالله در آموزش های بعدی شاید استفاده کردیم ازش . خیلی وارد جزئیات نمیشم . چون تقریبا در آموزش جنگو مقدماتی این مطالب رو کامل توضیح دادم . مهمترین و اصلی ترین کاری که یادتون باشه بعد از نصب هر App باید انجام بدید ، معرفی اون App به پروژه هست . یعنی فقط ایجاد App کفایت نمیکنه . شما باید به پروژه اطلاع بدید که این اپ به پروژه باید اضافه بشه . پس وارد فایل settings.py شوید و اسم App رو به بخش INSTALLED_APP اضافه کنید : همانطور که در تصویر می بینید یکسری App هم به صورت پیش فرض با نصب جنگو و ایجاد پروژه ، ایجاد می شوند که اتوماتیک به پروژه معرفی شده اند . به دایرکتوری در ستون سمت چپ پای چرم در تصویر نگاه کنید . اگر تمام مراحل رو درست انجام داده باشید ، باید یک دایرکتوری شبیه به عکس بالا داشته باشید . خب بسیار عالی . طبق سرفصلی که در جلسه اول پیش بینی کردیم قرار شد در ۸ قسمت یک وبلاگ جنگویی ایجاد کنیم . شما در این قسمت با نحوه ساخت App آشنا شدید . این آموزش های اولیه رو خوب مطالعه کنید و اگر سوالی دارید در تاپیک های مخصوص هر آموزش بپرسید . چون در سری های بعدی آموزش های مختلف دیگه این مطالب توضیح داده نمیشه و سریع ازش رد می شیم . جلسه سوم از سری آموزش پروژه محور ساخت یک وبلاگ ساده با جنگو به پایان رسید . موفق و پیروز باشید پایتونی ها
  7. این تاپیک پشتیبانی برای آموزش است ساخت یک وبلاگ ساده با جنگو ( قسمت سوم ) 29/05/96 18:13 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  8. با سلام خدمت پایتونی های عزیز با قسمت دوم از سری آموزش پروژه محور ساخت یک وبلاگ ساده با فریم ورک جنگو در خدمت شما عزیزان هستیم . در قسمت قبل یعنی قسمت اول ملزومات ایجاد این پروژه رو به شما عزیزان گفتیم و بستر شروع کار رو آماده کردیم . پس با ما باشید تا در این قسمت با همدیگر یک پروژه برای وبلاگمون ایجاد کنیم . ساخت یک پروژه برای وبلاگ جنگویی خب همانطور که مطمئنا در آموزش مقدماتی جنگو مطالعه کردید و متوجه شدید ، ساخت یک وبسایت با فریم ورک جنگو یک مقدار متفاوت هست با زبان های دیگه . اگر تا الان مشغول ایجاد سایت های استاتیک بودید و یا با PHP برنامه نویسی می کردید ، در اینجا یک مقدار کار متفاوت است . میخوام به زبان خیلی خیلی ساده براتون توضیح بدم . وقتی میخواید یک وبسایت با جنگو ایجاد کنید ، کل کار به صورت زیر است : 1 - یک فولدر برای وب سایت خودتون می سازید 2 - داخل وب سایت محیط مجازی خودتون ( virtualenv ) رو نصب می کنید 3 - یک پروژه ایجاد می کنید 4 - سپس هر تعداد APP که احتیاج داشتید ، در داخل پروژه اصلی خودتون ایجاد می کنید . پس در این قسمت ما میخوایم مرحله شماره ۳ رو انجام بدیم . یعنی ساختار اصلی پروژه مون رو ایجاد کنیم . این مراحل برای ساخت هر وبسایتی به همین شکل هست . البته میتونه یک مقدار متفاوت باشه که ما اصلا نمیخوایم وارد جزئیات بشیم . فقط میخوایم در عرض چند جلسه به صورت خیلی خلاصه و سریع به شما یاد بدیم که اصلا نترسید و یک وب سایت با جنگو ایجاد کنید . انشاالله در قسمت های بعدی از سری آموزش های پروژه محور جنگو ، برای شما پروژه های حرفه ای تر و سخت تر رو آموزش می دیم . یادآوری : در جلسه قبلی یک فولدر به نام pythonyhd ایجاد کردیم . واردش شدیم . با دستورات گفته شده ویرچوال انو رو نصب کردیم . فعالش کردیم . جنگو رو نصب کردیم . دستور pip freeze رو اجرا کردیم . ما در جنگو یه دستور خط فرمانی داریم به نام django-admin . این دستور همانطور که از نامش معلومه برای کارهای مدیریتی در جنگو هست . این دستور به فایل django-admin.py اشاره میکنه . وقتی ما یک پروژه ایجاد میکنیم ، در همین جلسه خواهید دید که به صورت اتوماتیک همیشه یک فایل در روت پروژه مون به نام manage.py ایجاد میشه . این دوتا فایل تقریبا شبیه هم هستند و برای کارهای مدیریتی استفاده میشن . طبق تعریف از سایت رسمی جنگو ، این فایل ۲ کار مهم برای ما میکنه : 1 - این بسته پروژه شما را بر روی sys.path قرار می دهد. 2 - این مجموعه متغیر محیطی DJANGO_SETTINGS_MODULE را به گونه ای تنظیم می کند که به فایل settings.py پروژه شما اشاره دارد. خب خیلی نمیخوام شلوغش کنم . بعدا سعی میکنیم راجب این دستور بیشتر صحبت کنیم . کاری که الان با این دستور داریم ایجاد یک پروژه جنگو است و تمام . برای ایجاد پروژه اصلی جنگو خودمون از دستور زیر استفاده می کنیم : $ django-admin startproject pythonyha خب فکر کنم خیلی دستور واضحی هست . فقط آخرین کلمه ای که نوشتیم اسم پروژه ماست . شما هرچی دوست دارید میتونید بزارید . ولی توصیه میکنم با ما جلو بیاید که بعدا احیانا به مشکل نخورید . خب وقتی شما این دستور رو در ترمینال خودتون بزنید به ظاهر چیزی اتفاقی نمیوفته . حالا برید به فولدر پروژتون سر بزیند . وقتی وارد فولدر بشید خواهید دید که یک فولدر دیگه درست شده داخلش به اسم pythonyha ایجاد شده . خب این فولدر ، فولدر پروژه ماست . از این به بعد ( اکثرا ) هر کاری بخوایم کنیم باید داخل این فولدر ( پروژه ) باشیم . یعنی تمام App هایی که خواهیم ساخت باید در این پروژه اصلی باشیم . خب شما موفق شدید که پروژه اصلی خودتون رو درست کنید . بزارید یک نگاه به فایل های داخل پروژه مون بکنیم . وارد فولدر پروژه بشید : می بینید که وقتی وارد پروژه مون شدیم یک فولدر هست که باز به نام پروژه مون به صورت اتوماتیک ایجاد شده و یک فایل به اسم manage.py که در ابتدای این قسمت خیلی کوتاه راجبش صحبت کردیم و گفتیم که وظایف مدیریتی داره این فایل . تقریبا از اسمش هم معلومه . حالا وارد فولدر اصلی پرژوه بشیم فایل های زیر رو خواهیم دید : دوستان عزیز لطفا به آدرس بار بالای عکس نگاه کنید . سه تا دایرکتوری pyhtonyha می بینید ! لطفا قاطی نکنید این فولدر هارو . pythonyha اول : اسم فولدر اصلی ما بود که شما هرچی دوست دارید میتونید بزارید . اصلا مهم نیست. میتونید بزارید مثلا mysite . pythonyha دوم : اسم پروژه مون بود که معولا باید اسم پروژه مون رو بزاریم . فرض کنید میخواید سایت پایتونی ها طراحی کنید . پس باید اسم پروژه مون همین pythonyha باشه . pythonyha سوم : این فولدر به صورت اتوماتیک دقیقا هم نام با پروژه مون در داخل پروژه مون ایجاد میشه . هرچی اسم پروژه تون باشه ، بعد از ایجاد پروژه ، یک فولدر دقیقا با نام پروژه در داخل اون ایجاد میشه . امیدوارم که کاملا متوجه شده باشید . اگر چندین بار این کار رو با اسامی مختلف انجام بدید دقیقا متوجه کار خواهید شد . خب در داخل فولدر pythonyha‌ چهار فایل وجود داره که کم کم در مراحل بعدی ازشون استفاده میکنیم . البته قبلا فایل settings.py‌ رو براتون توضیح دادم . شما الان موفق به ساخت پروژه اصلی خودتون شدید و همه چی آماده است . دوست دارید یک سر به سایتی که تا اینجا ایجاد کردید بزنید ؟ خب ابتدا با دستور زیر وارد پروژه بشید : $ cd pythonyha و بعد با دستور زیر سرور جنگو رو Run کنید : $ python manage.py runserver در سری آموزش جنگو مقدماتی ، قسمت آموزش ساخت یک پروژه و App در فریم ورک جنگو به شما عزیزان گفتیم که این ارور قرمز رنگ چیه و چجوری میتونیم اونو بر طرف کنیم . پس دیگه اینجا توضیح نمیدم . دستور زیر رو بزنید : $ python manage.py migrate خب حالا همه چی آمادست . اولین قدم از ساخت وب سایت جنگویی خودتون رو برداشتید . حالا مرورگر خودتون رو باز کنید و چون سرور جنگو Run‌ هست فقط با زدن یکی از آدرس های زیر سایت خودتون رو ببینید : localhost:8000 OR 127.0.0.1:8000 خب اگر تصویر بالا رو به عنوان صفحه اصلی سایتتون اگر دید که تبریک میگیم . کارتون بدون عیب و نقص انجام شده و به مرحله و قسمت بعدی آموزش برید و لذت ببرید . اگر هم با ارور مواجه شدید حتما به تاپیک پشتیبانی این آموزش مراجعه کنید و سوال بپرسید تا دوستان سریعا به شما کمک کنند . خب تقریبا قسمت دوم آموزش ساخت یک وبلاگ ساده با جنگو به پایان رسیده . تقریبا از قسمت چهارم وارد کدنویسی میشیم . در سری آموزش های پروژه محور بعدی خیلی سریع تر از این قسمت ها عبور میکنیم و سعی میکنیم ۳ قسمت اول این پروژه رو در یک قسمت به صورت خیلی خلاصه و سریع بگیم و ازش رد بشیم . چند بار مسائل گفته شده رو تمرین کنید و سعی کنید قشنگ درک کنید و متوجه بشید . موفق و پیروز باشید . پایتونی ها
  9. این تاپیک پشتیبانی برای آموزش است ساخت یک وبلاگ ساده با جنگو ( قسمت دوم ) 27/05/96 01:17 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  10. با سلام خدمت پایتونی های عزیز در خدمت شما هستیم با جلسه اول سری آموزش ساخت وبلاگ ساده با فریم ورک جنگو . با ما باشید و ما رو حمایت کنید . ساخت یک وبلاگ ساده با جنگو خب عزیزان در این سری آموزش که به احتمال خیلی زیاد طولانی نیست و نمیخوایم شما رو زیاد درگیر مسائل پیچیده کنیم ، خیلی سریع استارت ساخت یک وبلاگ رو میزنیم . من به شما پیشنهاد میکنم قبل از دیدن این سری آموزش حتما به لینک زیر مراجعه کنید و مطالب رو از قسمت اول بخونید . چون خیلی از مطالبی که در لینک زیر گفته شده است رو دیگر تکرار نمی کنیم و سریع از کنارش عبور میکنیم . آموزش جنگو مقدماتی در سری آموزش جنگو مقدماتی نحوه نصب پایتون ، نصب ویرچوال انو ، ایجاد یک پروژه جنگو ، آموزش View ، آموزش مدل جنگو و ... خیلی موارد دیگه رو آموزش دادیم که دیگه این مطالب در آموزش های پروژه محور تکرار نخواهند شد . خب برای ایجاد یک وبلاگ ما باید چه قدم هایی برداریم ؟ چه کارهایی باید کنیم ؟ تقریبا باید مراحل زیر طی بشه تا پروژه ما کامل بشه و بتونیم بگیم که یک وبلاگ پویا ایجاد کرده ایم : 1 - الزامات ابتدایی پروژه جنگو 2 - شروع و استارت پروژه 3 - شروع و استارت برنامه ( App ) وبلاگ 4 - نوشتن مدل مناسب وبلاگ 5 - ایجاد پایگاه داده ( دیتا بیس ) 6 - اتصال پنل مدیریت پیش فرض مدیر جنگو به برنامه وبلاگ 7 - نوشتن URL ها، View ها و قالب ها برای برنامه وبلاگ 8 - اضافه کردن تمپلیت ها ( کدهای HTML و CSS در حد نیاز ) خب پس ما باید تقریبا ۸ مرحله رو طی کنیم تا یک وبلاگ خیلی خیلی ساده رو ایجاد کنیم . انشاالله سعی خواهیم کرد به مراتب آموزش های پروژه محور رو سخت تر و حرفه ای تر و کارآمد تر تهیه کنیم تا دوستان عزیز کاملا به فریم ورک جنگو مسلط شوند . قسمت اول : الزامات ابتدایی پروژه جنگو در قسمت اول باید ببینیم برای ایجاد پروژه جنگو به چه چیز هایی احتیاج داریم و ملزمات رو آماده کنیم . نصب پایتون ما احتیاج داریم که پایتون بر روی سیستم عامل ما نصب باشه برای شروع کار . ترمینال خود را باز کنید و کلمه python را تایپ کنید و اینتر بزنید . اگر واحد محیط کد نویسی پایتون شدید پس خیالتون راحت باشه که پایتون نصب هست . البته سیستم عامل های لینوکس بیس به صورت پیش فرض پایتون رو بروی خودشون نصب دارند . اگر پایتون روی سیستم شما نصب نیست به لینک زیر مراجعه کنید تا یاد بگیرید نحوه نصب پایتون بر روی ویندوز و لینوکس رو : نصب پایتون ( python ) بر روی لینوکس - اوبونتو نصب پایتون ( python ) بر روی ویندوز نصب پایتون ( python ) بر روی مک - مکینتاش خب امیدوارم که در نصب پایتون مشکلی نداشته باشید و اگر هرکجا به مشکلی برخوردید حتما در تاپیک پشتیبانی مربوط به آموزش های بالا سوال و ارور خودتون رو مطرح کنید . نصب ویرچوال انو ( Virtualenv ) خب حالا که پایتون بر روی سیستم شما نصب هست شروع میکنیم ایجاد پروژه رو . ابتدا در هر کجایی که میخواهید یک فولدر به نام pythonyha ایجاد کنید . سپس وارد این پوشه شوید و ترمینال خود را باز کنید ( یا از طریق ترمینال به دایرکتوری بالا بیاید یا وقتی وارد پوشه بالا شدید کلیک راست کنید و گزینه Open Terminal رو بزنید ) . با دستور زیر ویرچوال انو را نصب کنید : $ pip install virtualenv $ virtualenv .env حتما به شما پیشنهاد میکنم که آموزش زیر رو که درباره ویرچوال انو هست مطالعه کنید : Virtual environment ( ویرچوال انو ) چیست و چگونه نصب می شود ؟ خب امیدوارم بعد مطالعه آموزش بالا کاملا با ویرچوال انو آشنا شده باشید و بدونید که ویرچوال انو چیست و چرا باید قبل از ایجاد هر پروژه ، اون رو نصب و ایجاد کنیم . نصب جنگو خب بعد از اینکه فولدر پروژه مد نظرمون رو ایجاد کردیم و وارد اون دایرکتوری شدیم و بعد ویرچوال انو رو نصب کردیم و فعالش کردیم ، نوبت اون رسیده که فریم ورک جنگو رو نصب کنیم تا بتونیم در بستر اون وب سایت خودمون رو ایجاد کنیم . برای نصب جنگو از دستور زیر استفاده کنید : $ pip install django OR $ pip install django=1.11.4 اگر دوست دارید که دردسر نکشید و اتوماتیک آخرین نسخه جنگو رو نصب کنید از کد خط اول استفاده کنید . ولی اگر ورژن خاصی بجز ورژن آخر جنگو در نظرتون هست می تونید از دستور خط دوم استفاده کنید و ورژن مورد نظر خودتون رو به جای ورژن بالا بنویسید . حتما بهتون پیشنهاد میکنم که آموزش زیر رو بخونید : آموزش نصب فریم ورک جنگو ( Django ) در لینوکس آموزش نصب فریم ورک جنگو ( Django ) بر روی ویندوز pip freeze خب طبق آموزش هایی که قبلا دادیم گفتیم که هرگاه ما در پروژه مون افزونه ( پلاگین ) و یا هر چیز دیگری نصب میکنیم ، احتیاج داریم که در داخل یک فایل تکست بنویسیم . چرا ؟ به دلایل مختلف . که اینجا ۲ تاشو میگم : ۱ - هر وقت پروژه شما به دست کسی رسید با یک نگاه ساده متوجه بشه که چه چیزهایی در پروژه شما نصب شده ۲ - بعدا بتونیم هرگاه نیاز بود به راحتی با اجرای این فایل دستور بدیم که هر چیزی که در این فایل ذکر شده در پروژه مون نصب بشه . حالا برای این کار از دستور زیر استفاده کنید : $ pip freeze > requirements.txt حتما پیشنهاد میکنم آموزش زیر رو ببینید و دقیقا متوجه بشید که چرا این کار رو انجام دادیم : آموزش pip freeze خب خسته نباشید . تقریبا بستر آماده آماده شده . تا اینجا تمام مواردی که برای ایجاد یک پروژه جنگو لازم بوده رو اجرا کردیم . این مراحل تقریبا برای ایجاد هر پروژه ای لازم هستند و باید اجرا شوند . البته خیلی کارهای دیگه هم میشه کرد که فعلا چیزی نمیگیم و خیلی ساده و بی دردسر پیش میریم . خب تقریبا قسمت اول از سری آموزش پروژه محور ساخت وبلاگ ساده با فریم ورک جنگو به پایان رسید . امیدوارم که براتون مفید واقع شده باشه . هرگونه سوال ، مشکل ، ارور و ... داشتید به تاپیک پشتیبانی این آموزش مراجعه کنید . موفق و پیروز باشید پایتونی ها
  11. این تاپیک پشتیبانی برای آموزش است ساخت یک وبلاگ ساده با جنگو ( قسمت اول ) 25/05/96 20:14 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  12. این تاپیک پشتیبانی برای آموزش است کتاب جنگو - آموزش View ها و URLconf ها در جنگو ( جلسه سوم ) 24/03/96 17:25 24/03/96 18:01 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  13. آموزش View ها و URLconf ها در جنگو در فصل گذشته ما نحوه نصب و راه اندازی سرور جنگو را توضیح دادیم. در این فصل شما قواعد ساختن صفحات داینامیک از طریق فریم ورک جنگو (Django) و همچنین استفاده از view ها و URLconf ها را خواهید آموخت. اولین برنامه جنگو به عنوان اولین قدم بیایید یک صفحه وب که خروجی معروف Hello world را چاپ می کند را بسازیم. در صورتیکه شما یک Hello world ساده را بدون استفاده از یک فریم ورک وب ایجاد کرده باشید، به صورت ساده عبارت Hello world را درون یک فایل متنی وارد کرده و آنرا به عنوان مثال با نام hello.html، در یک پوشه جایی درون وب سرور ذخیره می کردید. دقت کنید که شما دو موضوع کلیدی را در مورد آن صفحه وب در نظر می گیرید: محتویات آن (رشته "Hello world") و URL آن (http://www.example.com/hello.html، و یا شاید http://www.example.com/files/hello.html اگر شما آن فایل را درون یک پوشه زیر مجموعه قرار داده باشید). در جنگو شما این کار را با کمی تفاوت انجام می دهید. محتویات صفحه توسط یک تابع view تولید می شوند، و URL در یک URLconf تعیین شده است. ابتدا بیایید تابع view حاوی Hello world را بنویسیم. اولین view شما داخل پوشه mysite که با دستور django-admin startproject در فصل قبل ساختید، یک فایل خالی با نام views.py ایجاد کنید. این ماژول پایتون (views.py) حاوی view های ما برای این فصل می باشد. نکته اینکه چیز خاصی برای انتخاب نام views.py وجود ندارد، در جنگو اجباری برای انتخاب نام وجود ندارد، اما ایده خوبی است که مانند یک قرارداد نام آنرا views.py گذاشته تا برای توسعه دهندگان دیگر خوانایی کد شما بیشتر باشد. view مورد نظر ما بسیار ساده است. اینجا تابع view را مشاهده خواهید کرد، همچنین باید جمله import را داخل فایل views.py تایپ کنید: from django.http import HttpResponse def hello(request): return HttpResponse("Hello world") بیایید به بررسی کد بالا بپردازیم: در ابتدا، ما کلاس HttpResponse را درون ماژول import کردیم، این کلاس در ماژول django.http می باشد که در ادامه کد به آن نیاز خواهیم داشت. یک تابع به نام hello را در ماژول تعریف کردیم که تابع view نامیده می شود. هر تابع view حداقل یک پارامتر را دریافت می کند، که به صورت قرارداد request نامیده می شود. پارامتر request یک شیء می باشد که حاوی اطلاعات درباره request وب فعلی است، همچنین آن یک instance از کلاس django.HttpRequest است. در این مثال ما هیچ کاری را با شیء request انجام نمی دهیم، اما باید آنرا به عنوان اولین پارامتر از تابع view قرار داد. نکته اینکه نام تابع view اهمیتی برای جنگو ندارد، به صورتی که روش ثابتی برای نام گذاری تابع view وجود ندارد که جنگو بتواند از طریق آن تابع را تشخیص دهد. برای اینکه یک تابع پایتون یک view برای جنگو به شمار بیاید بایستی یک HttpRequest را به عنوان اولین پارامتر دریافت کرده و یک instance از HttpRespose را برگرداند بدین صورت جنگو یک تابع view را از توابع ساده پایتون تشخیص می دهد(البته استثناهایی نیز وجود دارد که در ادامه به آنها خواهیم پرداخت.) تابع یک خطی ساده: view فقط یک تابع پایتون می باشد که یک HttpRequest را به عنوان اولین پارامتر دریافت می کند و یک instance از HttpResponse را بر می گرداند. برای اینکه یک تابع پایتون بتواند یک view برای جنگو باشد، باید این دو کار را انجام دهد. (البته استثناهایی نیز وجود دارد اما بعدا به آنها خواهیم پرداخت) اولین URLconf شما اگر تا اینجای کار دوباره دستور manage.py runserver را اجرا کنید، باز هم صفحه خوش آمدگویی به جنگو را خواهید دید و اثری از Hello world نخواهید دید. دلیل این است پروژه mysite چیزی درباره view نمی داند و تابع hello را نمی شناسد؛ نیاز است به جنگو گفته شود که یک view در یک URL مشخص قرار دارد. برای این منظور، یعنی اتصال تابع view به یک URL مشخص با جنگو، از یک URLconf استفاده می شود. یک URLconf شبیه به فهرست مطالب در یک وب سایت است که رابطه بین URL ها و توابع view را نمایش می دهد که در واقع بیان کننده رابطه بین URL و تابعی که آن URL بایستی فراخوانی کند، می باشد.به عبارت دیگر به جنگو می گوید که برای هر URL، باید کدام کد فراخوانی شود. برای مثال هنگامی که شما آدرس http://example.com/foo را درخواست می کنید، تابع foo_view() که در ماژول views.py قرار دارد فراخوانی شود. هنگامی که شما دستور django-admin.py startproject را در فصل قبلی اجرا کردید، یک URLconf به صورت اتوماتیک برای شما ساخته شد: فایل urls.py به صورت پیش فرض چیزی شبیه به کد زیر می باشد: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: # (r'^admin/', include(admin.site.urls)), ) URLconf به طور پیشفرض شامل قسمت هایی از خصوصیات جنگو می باشد که به صورت کامنت وجود دارد، کد اصلی URLconf به شکل زیر می باشد: from django.conf.urls.defaults import * urlpatterns = patterns('', ) بیایید کد فوق را مورد بررسی قرار دهیم: در خط اول تمام شیء های ماژول django.conf.urls.defaults که زیر بنای URLconf می باشند به درون ماژول فعلی import شده است، که شامل تابع patterns نیز می شود. در خط بعد تابع patterns فراخوانی شده و حاصل کار درون متغیر urlpatterns ریخته شده است. تابع patterns یک آرگومنت ارسال می کند که یک رشته خالی است. (یک رشته که می تواند یک prefix عمومی برای توابع view باشد، که در آموزش view و urlconf پیشرفته درباره آن صحبت خواهد شد.) نکته اصلی متغیر urlpatterns می باشد که جنگو درون URLconf به آنرا پیدا خواهد کرد. این متغیر رابطه بین URL ها و کد را تعریف می کند. به صورت پیشفرض همانطور که ملاحظه کردید URLconf خالی است (نکته آنکه، جنگو به چه صورت همانطور که در فصل گذشته مشاهده کردید می داند که صفحه خوش آمد گویی را نشان دهد؟ جواب این است که هنگامی که URLconf شما خالی باشد، جنگو فرض می کند شما تنها یک پروژه را آغازکردید، بنابراین، آن صفحه را نمایش می دهد.) برای اضافه کردن URL و view به URLconf، تنها کافی است یک تاپل پایتون متصل شده به یک الگوی URL را به تابع view اضافه کنید. در کد زیر نحوه انجام این کار مشخص شده است: from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), ) (دقت کنید که ما کدها کامنت را برای کوتاهی کد حذف کردیم، شما می توانید اگر دوست دارید آن ها را در کد خود نگهدارید) دو تغییر در کد فوق ایجاد شده است: ابتدا، تابع hello از ماژول خود (mysite/views.py که به زبان پایتون تغییر کرده و به mysite.view تبدیل شده) import شده است. همچنین قسمت ('^hello/$, hello) به urlpatterns اضافه شده است. اندیس اول تاپل مبوط به URLpattern می باشد که با URL وارد شده در ارتباط خواهد بود و اندیس دوم اشاره به view دارد. به طور خلاصه، ما به جنگو گفتیم که هر request ای که به آدرس /hello/ ارسال می شود باید با تابع view یعنی hello کنترل شود. مسیر پایتون هنگامی که از جمله import استفاده می کنیم، پایتون به یک لیست از دیکشنری ها مراجعه می کند که مسیر پایتون در آن وجود دارد. برای مثال اگر مسیر پایتون شما به این شکل باشد ['', '/usr/lib/python2.4/site-packages', '/home/username/djcode']، و شما جمله from foo import bar را اجرا کنید، پایتون به دنبال یک ماژول به نام foo.py در پوشه فعلی می گردد. (اولین اندیس دیکشنری در مسیر پایتون، یک رشته خالی می باشد، که به معنی پوشه یا مسیر فعلی می باشد) اگر فایل مورد جستجو (foo.py) در مسیر جاری وجود نداشت، پایتون به دنبال آن فایل در این مسیر خواهد گشت /usr/lib/python2.4/site-packages/foo.py. اگر فایل درون آن مسیر هم وجود نداشت، مسیر /home/username/djcode/foo.py را نیز جستجو خواهد کرد، در پایان اگر فایل در مسیرهای ذکر شده یافت نشد. خطای importError ایجاد خواهد شد. اگر مشتاق هستید که مسیر پایتون خودتان را ببینید، interactive interpreter پایتون را باز کرده و کد زیر را وارد کنید. >>> import sys >>> print sys.path عموما شما نسبت به تنظیم مسیر پایتون نگرانی نخواهید داشت، پایتون و جنگو به صورت اتوماتیک در پشت صحنه تنظیمات مربوط به مسیر پایتون را انجام می دهند. (تنظیم مسیر پایتون یکی از وظایفی است که manage.py انجام می دهد) موضوع قابل بحث syntax ای باشد که URLpattern از آن استفاده می کنند، که با حالت آدرس دهی معمولی کمی متفاوت است: جنگو علامت (/) را از مقابل هر URL ورودی قبل از چک کردن URLpatterns حذف می کند. (درباره این موضوع در آموزش view و urlconf پیشرفته صحبت شده است) درون الگوی فوق یک علامت (^) و یک علامت ($) وجود دارد، که حروف regular expression می باشد و معانی خاصی دارند: علامت (^) به معنی این می باشد که URL مربوط ابتدای آدرس است و علامت ($) بدین معنی است URL مربوط انتهای آدرس می باشد. مفهوم فوق با یک مثال خوب قابل توضیح است. اگر بجای الگوی فوق ('^hello/$') از این الگو استفاده کنیم '^hello/' (بدون گذاشتن علامت $ در انتهای URL)، در اینصورت هر URL ای که با /hello/ شروع می شود شامل آدرس URLpattern خواهد شد، مانند /hello/foo و /hello/bar، به همین صورت اگر علامت (^) را از ابتدای URL برداریم ('hello/$') جنگو هر URL ای که با hello/ پایان می یابد را شامل آدرس URLconf خواهد دانست، مانند /foo/bar/hello/، و اگر URL را به این صورت استفاده کنیم hello/، یعنی بدون علامت (^) و ($)، هر URL ای که حاوی hello/ باشد را شامل خواهد شد مانند /foo/hello/bar. بنابراین در اینجا ما از هر دو علامت فوق استفاده کردیم تا تنها آدرس /hello/ بتواند با URL مورد نظر match شود، نه بیشتر و نه کمتر. نکته دیگر اینکه تابع view یعنی hello به صورت یک شیء بدون فراخوانی تابع به patterns ارسال شده است. این یکی از خصوصیات کلیدی از پایتون (و زبانهای داینامیک دیگر) است: توابع شیء های خاصی هستند، بدین معنی که می توان آن ها را مانند هر متغیر دیگری ارسال کرد. برای تست کردن تغییرات درون URLconf، سرور جنگو را اجرا کنید، همانطور که در فصل 2 توضیح داده شد، با دستور python manage.py runserver. (اگر سرور از قبل اجرا شده است، دیگر نیازی به اجرا کردن دوباره آن نمی باشد زیرا همانطور که پیش تر گفته شد، به محض ایجاد تغییر در کد و ذخیره آن سرور جنگو خود را بروز رسانی کرده و به صورت اتوماتیک دوباره اجرا می شود.) سپس مرورگر را باز کرده، و به آدرس http://127.0.0.1:8000/hello/ بروید. نوشته Hello world را باید در خروجی تماشا کنید. هوررا! شما اولین صفحه وب ساخته شده با جنگو را ایجاد کردید. Reqular Expressions Regular expression ها یا regexes یک روش فشرده و یا جمع و جور برای تعیین الگوها در متن می باشد. در اینجا تعدادی از نمادهای عمومی regex را مشاهده می کنید: نماد مچ می شود با . (نقطه) یک تک حرف \d یک عدد یک رقمی [A-Z] هر حرف بین A تا Z بزرگ [a-z] هر حرف بین a تا z کوچک [A-Za-z] هر حرف بین a تا z بدون حساس بودن به بزرگی و کوچکی تعداد یک یا بیشتر از عبارت قبل آن (مانند \d تعداد یک یا بیشتر ارقام) [^/] یک حرف یا بیشتر تا یک (/) ? تعداد صفر یا یک از عبارت قبلی (مانند \d?، صفر یا یک رقم) * تعداد صفر یا بیشتر ار عبارت قبلی (مانند \d*، صفر یا بیشتر ارقام) {1,3} تعداد یک و سه از عبارت قبلی (مانند \d{1,3} یک، دو یا سه رقم) اشاره ای کوتاه به خطای 404 تا اینجای کار، URLconf ما تنها یک URLpattern تعریف کرده است. چه اتفاقی می افتد اگر یک درخواست با URL متفاوت ارسال شود؟ برای پی بردن به جواب، سرور جنگو را اجرا کرده و یک پیج با همچین آدرسی را باز کنید: http://127.0.0.1:8000/goodbye/ یا http://127.0.0.1:8000/hello/subdirectory، یا حتی http://127.0.0.1:8000/ (روت سایت). شما باید صفحه ای با پیام"page not found" که در شکل 1-3 نشان داده شده است مشاهده کنید. جنگو این پیام را نشان می دهد زیرا درخواست شما URL ای می باشد که در URLconf تعریف نشده است. شکل 1-3 پیام خطای 404 جنگو بسیار تواناتر از خطای عادی 404 می باشد. همچنین خطای 404 جنگو دقیقا URLconf استفاده شده و الگوی آن را نشان می دهد. با این اطلاعات نشان داده شده شما می توانید به راحتی دلیل ایجاد شدن خطای 404 را متوجه شوید. طبیعتا اطلاعات نشان داده شده توسط جنگو برای خطای 404 تنها برای شما ایجاد شده است یعنی برای توسعه دهندگان وب. اگر که نمی خواهید این اطلاعات برای عموم نشان داده نشوند، این نکته اهمیت دارد که جنگو زمانی پیام مخصوص به خود را نشان می دهد که پروژه جنگو در حالت debug باشد. در فصل های آینده نحوه غیر فعال کردن حالت debug را توضیح خواهیم داد. تنها چیزی که باید الان بدانید این است که هر پروژه جنگو هنگامی که ساخته می شود به صورت پیشفرض در حالت debug می باشد و در صورتی که این حالت غیر فعال باشد، جنگو خروجی متفاوتی را نشان خواهد داد. اشاره ای کوتاه به ریشه سایت (site root) همانطور که در قسمت قبلی گفته شد، حتی اگر شما به آدرس ریشه سایت http://127.0.0.1:8000/ هم مراجعه می کردید خطای 404 ایجاد می شد. برای اینکه بتوان در URLconf آدرس ریشه سایت را با یک تابع view مرتبط کرد مانند مثال زیر باید عمل کرد: from mysite.views import hello, my_homepage_view urlpatterns = patterns('', ('^$', my_homepage_view), # ... ) نحوه پردازش درخواست قبل از ادامه کار برای نوشتن دومین تابع view، اجازه دهید مکثی برای فهمیدن بیشتر نحوه عملکرد جنگو داشته باشیم. هنگامی که شما پیام Hello world را با رفتن به آدرس http://127.0.0.1:8000/hello/ در مرورگر خود مشاهده می کنید، جنگو در پشت صحنه چگونه عمل می کند؟ همه چیز با فایل settings.py آغاز می شود. هنگامی که شما فرمان python manage.py runserver را اجرا می کنید، اسکریپت به دنبال فایل settings.py در مسیر همسان با مسیر manage.py می گردد. این فایل حاوی تمام پیکربندی های مربوط به پروژه جنگو می باشد که همگی به صورت حروف بزرگ انگلیسی می باشند: TEMPLATE_DIRS، DATABSE_NAME، و غیره. مهمترین تنظیم ROOT_URLCONF نام دارد. ROOT_URLCONF به جنگو می گوید که کدام ماژول پایتون باید به عنوان URLconf برای این وب سایت استفاده شود. هنگامی که django-admin.py startproject فایل های settings.py و urls.py را ایجاد می کرد را بخاطر می آورید؟ فایل به صورت اتوماتیک ساخته شده settings.py حاوی تنظیم ROOT_URLCONF است که به فایل اتوماتیک ساخته شده urls.py اشاره می کند. فایل settings.py را باز کرده و خودتان مشاهده کنید، مانند: ROOT_URLCONF = 'mysite.urls' کد فوق برابر با mysite/urls.py می باشد. زمانی که یک درخواست برای یک URL خاص فرستاده می شود، جنگو URLconf ای که در تنظیم ROOT_URLCONF به آن اشاره شده است را بار گذاری می کند. سپس شروع به چک کردن URL ای که در request آمده است با الگوهای موجود در URLconf، تا زمانی که یک الگوی مرتبط پیدا شود. هنگامی که یک الگوی مرتبط پیدا شد، تابع view مربوط به آن الگو را فراخوانی کرده و یک شیء HttpRequest بعنوان اولین پارامتر به آن ارسال می کند. (در مورد HttpRequest به طور ویژه ای در فصل های بعدی صحبت خواهد شد.) به طور خلاصه: یک درخواست به /hello/ فرستاده می شود. جنگو ریشه URLconf را با نگاه به تنظیم ROOT_URLCONF تعیین می کند. جنگو به تمامی URLpattern ها برای پیدا کردن یک URL مرتبط با /hello/ جستجو می کند. اگر URL مرتبطی یافت شد، تابع view مربوط به آن URL فراخوانی می شود. تابع view یک HttpResponse بر می گرداند. جنگو HttpResponse را برای نشان دادن نتیجه در یک صفحه وب به شکل مناسب تبدیل می کند. حالا شما به طور کامل نحوه عمکرد جنگو را می دانید، البته تا این حد که چگونه تابع view به URL مربوط به خود از طریق URLconf وصل می شود. دومین view: دارای محتوای داینامیک view قبلی تنها یک نمایش آموزنده از نحوه کار جنگو بود، و مثال یک صفحه پویا (dynamic) بحساب نمی آید، زیرا محتوای صفحه همواره یک چیز ثابت می باشد. در هر زمانی که شما آدرس /hello/ را مشاهده کنید یک چیز ثابت را خواهید دید، که همانند یک فایل استاتیک HTML می باشد. برای دومین view، صفحه ای داینامیک خواهیم ساخت، یک صفحه وب که زمان و تاریخ فعلی را نمایش خواهد داد. این یک مثال ساده و مناسب می باشد، چرا که در این مثال با دیتابیس یا ورودی کاربر سر و کار نخواهیم داشت، تنها زمان داخلی سرور را به صورت خروجی استفاده خواهیم کرد. برای نوشتن view فوق باید زمان و تاریخ فعلی را محاسبه کرده، و به صورت یک HttpResponse آنرا بر گردانیم. اگر شما با زبان پایتون آشنایی داشته باشید، باید بدانید که پایتون حاوی یک ماژول به نام datetime می باشد که زمان و تاریخ را محاسبه می کند. در این نحوه استفاده از این ماژول را مشاهده خواهید کرد: >>> import datetime >>> now = datetime.datetime.now() >>> now datetime.datetime(2008, 12, 13, 14, 9, 39, 2731) >>> print now 2008-12-13 14:09:39.002731 به اندازه کافی استفاده از این ماژول ساده می باشد، و نیازی به انجام کاری توسط جنگو نیست. کد فوق تنها کد پایتون می باشد. تاکید ما بر این است که شما از محتویات کد که تنها برای پایتون می باشد و محتویاتی که مربوط به جنگو می باشد اطلاع کامل پیدا کنید، و به اشتباه در قسمت هایی که نیازی به کد جنگو نمی باشد از آن استفاده بیهوده و اضافه بر سازمان نکنید. برای ساختن یک view جنگو که زمان و تاریخ جاری را نمایش دهد، نیاز به قرار دادن جمله datetime.datetime.now() درون view و برگرداندن یک HttpResponse می باشد. که در کد زیر مشاهده می کنید: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) همچنین تابع hello نیز باید درون views.py وجود داشته باشد، ما تابع hello را در این کد فوق برای اختصار حذف کردیم. در اینجا view کامل را مشاهده می کنید. from django.http import HttpResponse import datetime def hello(request): return HttpResponse("Hello world") def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) بررسی کد فوق: در ابتدا برای محاسبه تاریخ و زمان، ماژول datetime را به بالای views.py اضافه کردیم. تابع جدید current_datetime زمان و تاریخ جاری را محاسبه می کند، و آنرا به صورت شیء درون متغیر محلی now ذخیره می کند. دومین خط از کد داخل تابع view یک پاسخ (request) HTML با استفاده از قابلیت format-string پایتون ایجاد می کند. %s داخل رشته بدین معناست که مقدار متغیر now جایگزین %s خواهد شد. متغیر now رشته نیست بلکه یک شیء datetime.datetime می باشد، ولی %s آن را به رشته تبدیل می کند، که چیزی شبیه به "14:09:39.002731 13-12-2008" می باشد. در پایان، تابع view همانند تابع hello یک شیء HttpResponse که حاوی پاسخ تولید شده است بر می گرداند. بعد از اضافه کردن تابع جدید به views.py، یک URLpattern نیز داخل urls.py ایجاد می کنیم، که برای جنگو مشخص شود که کدام URL باید view مورد نظر خود را کنترل کند. from django.conf.urls.defaults import * from mysite.views import hello, current_datetime urlpatterns = patterns('', ('^hello/$', hello), ('^time/$', current_datetime), ) دو تغییر ایجاد شده است. اول اینکه تابع current-datetime را در بالا import کردیم. و دومین تغییر که مهم تر از تغییر اول می باشد، یک URLpattern با آدرس /tim/ برای view جدید اضافه کرده ایم. آیا قلق کار دستتان آمد؟ با نوشتن view جدید و تغییر دادن URLconf سرور را اجرا کرده و درون مرورگر به این آدرس بروید http://127.0.0.1:8000/time/. شما باید زمان جاری را در صفحه مورد نظر مشاهده کنید. منطقه زمانی جنگو بسته به رایانه شما، زمان و تاریخ ممکن است چند ساعتی متفاوت باشد. دلیل این است که جنگو دارای منطقه زمانی می باشد و تنظیم پیشفرض آن بر روی America/Chicago می باشد. (این زمان برای جایی است که توسعه دهندگان اصلی در آنجا زندگی می کنند) اگر شما در جای دیگری زندگی می کنید می توانید این پیشفرض را تغییر دهید. برای این تنظیم کامنتی وجود دارد که می توانید در آن لینک مربوط برای به روز رسانی لیست جهانی منطقه زمانی را پیدا کنید. URLconf و مفهوم Loose Coupling حالا زمان خوبی است برای پرداختن به فلسفه کلیدی پشت URLconfs و جنگو: قانون loose coupling. به عبارت ساده، loose coupling یک شیوه توسعه نرم افزار است که در ساختن بخش های قابل تعویض اهمیت دارد. اگر دو بخش از کد به صورت loosely couple پیاده سازی شده باشند، هنگامی که در یک بخش تغییری ایجاد می کنیم، بر روی بخش دیگر تاثیر نمی گذارد و یا تاثیر بسیار کمی دارد. URLconf جنگو یک مثال بسیار خوب از این قانون می باشد. در یک برنامه وب جنگو تعریف های URL و توابع view، به صورت loosely couple نامیده می شوند؛ برای مثال، به تابع current_datetime ملاحظه کنید. اگر بخواهیم URL مربوط یه این تابع view را از /time/ به /current-time/ تغییر دهیم، می توانیم به سرعت و بدون هیچ نگرانی نسبت به تابع view مربوط به آن در URLconf تغییر ایجاد کنیم. به همین صورت اگر بخواهیم تابع view را نیز تغییر دهیم می توانیم بدون تاثیر بر روی URL آن این تابع را تغییر دهیم. بعلاوه اگر بخواهیم تابع current-date را برای چندین URL نمایش دهیم، می توانیم خیلی آسان URLconf را بدون هیچ گونه لمسی در تابع view تغییر دهیم. در مثال که در زیر مشاهده خواهید کرد، current-datetime برای دو URL در دسترس خواهد بود. urlpatterns = patterns('', ('^hello/$', hello), ('^time/$', current_datetime), ('^another-time-page/$', current_datetime), ) URLconf ها و view ها در عمل به صورت loosely couple پیاده سازی شده اند. ما در سرتاسر این کتاب از طریق مثال ها به این فلسفه مهم (loosely coupling) اشاره خواهیم کرد سومین view: آدرس های پویا (dynamic) در تابع current_datetime، محتویات صفحه یعنی زمان و تاریخ نشان داده شده، داینامیک بوده، اما URl (/time/) استاتیک می باشد. در اغلب برنامه های داینامیک وب، یک URL حاوی پارامترهایی است که بر روی خروجی صفحه تاثیر می گذارد. برای مثال یک فروشگاه کتاب آنلاین ممکن است برای هر کتاب URL مخصوص به خود را داشته باشد، مانند /books/243/ و /book/81196/. بیایید view سوم خودمان را با حالت URL داینامیک ایجاد کنیم که درون URL ساعت را دریافت کند. هدف از ساختن این سایت این است که در صورت وارد کردن /time/plus/1/ خروجی یعنی همان زمان و تاریخ در یک ساعت جلوتر نشان دهد، صفحه /time/plus/2/ زمان را 2 ساعت جلوتر از زمان فعلی نشان دهد، صفحه /time/plus/3/ زمان را 3 ساعت جلوتر نشان دهد و الی آخر. یک تازه کار یا مبتدی ممکن است فکر کند برای هر ساعت یک تابع view مجزا لازم است: urlpatterns = patterns('', ('^time/$', current_datetime), ('^time/plus/1/$', one_hour_ahead), ('^time/plus/2/$', two_hours_ahead), ('^time/plus/3/$', three_hours_ahead), ('^time/plus/4/$', four_hours_ahead), ) کد فوق به وضوح مشخص است که ناقص می باشد. نه تنها توابع view اضافه و زائد می باشند، بلکه برنامه اساسا به طور محدود تنها از 4 ساعت تعریف شده پشتیبانی می کند. اگر بخواهیم صفحه ای بسازیم پنج ساعت جلوتر را نشان دهد باید یک تابع View و URLconf برای آن ایجاد کنیم، که کاری تکراری می باشد. نیاز به مقداری اختصار در اینجا داریم. سخنی درباره URL های بهینه اگر با برنامه های دیگر توسعه ی وب نظیر Java و یا PHP کار کرده باشید، شاید این فکر به نظر شما خطور کند که باید از یک پارامتر query string استفاده کنید، مانند /time/plus?hours=3، بدین شکل که ساعت مورد نظر را درون پارامتر query string همانطور که نشان داده شد بعد از علامت (?) ارسال کنید. شما می توانید این مورد را با جنگو پیاده سازی کنید (نحوه ی انجام آن در فرم به خوبی بیان شده است)، اما یکی از فلسفه های هسته ی جنگو این است که URL به صورت کاملا زیبا استفاده شوند. آدرس /time/plus/3/ به مراتب تمیزتر، ساده تر، خواناتر و خواندن آن آسانتر از query string می باشد. URL های زیبا مشخصه ی کیفیت برنامه ی وب می باشند. حالا چطور می توان ساعت مشخص شده در URL را درون برنامه کنترل کرد؟ همانطور که پیش تر ذکر شد، URLpattern یک regular expression می باشد؛ از این رو، ما می توانیم از الگوی \d برای مچ کردن یک یا بیشتر ارقام استفاده کنیم. urlpatterns = patterns('', # ... (r'^time/plus/\d /$', hours_ahead), # ... ) (ما از # ... برای اشاره کردن به این موضوع که ممکن است URLpattern های دیگری نیز درون مثال وجود داشته باشند استفاده می کنیم.) این URLpattern جدید با هر آدرسی مانند /time/plus/2/، /time/plus/25/ یا حتی /time/plus/100000000/ مچ می شود. بهتر آن است که عدد وارد شده برای ساعت را محدود کنیم، به طوری که حداکثر عددی که بتوان وارد کرد 99 باشد. این بدین معنی است که می خواهیم تنها به وارد کردن اعداد یک یا دو رقمی اکتفا کنیم، شکل آن در regular expression بدین شکل خواهد بود \d{1,2}: (r'^time/plus/\d{1,2}/$', hours_ahead), نکته هنگام ایجاد برنامه های وب، چیزی که همیشه مهم می باشد کنترل بیشترین مقدار ممکن ورودی می باشد، و تصمیم گرفتن در مورد آنکه برنامه باید آن ورودی را پشتیبانی کند یا خیر. ما در اینجا با محدود کردن مقدار ساعت ورودی تا 99 این مورد را کنترل کرده ایم. یکی از جزئیات مهمی که معرفی شده است در اینجا حرف r می باشد که قبل URL استفاده شده است. این حرف به پایتون می گوید که رشته ی بعد از آن یک raw string می باشد، در این نوع رشته علامت (\) ترجمه یا تفسیر نمی شود. در رشته های معمولی پایتون علامت های (\) به حروف ویژه تفسیر می شوند مانند '\n'، که به یک کاراکتر خط جدید تبدیل می شود. هنگامی که از حرف r قبل یک رشته استفاده شود، مفسر پایتون دیگر علامت های (\) را تفسیر نمی کند، بنابراین r'\n' دیگر یک کاراکتر خط جدید نمی باشد و تنها دو کاراکتر می باشد، یک (\) و یک حرف کوچک n. بین کاربرد علامت (\) در پایتون و regular expression یک برخورد طبیعی وجود دارد، بنابراین شدیدا پیشنهاد می شود که هنگامی که می خواهید از regular expression استفاده کنید حتما از raw string ها استفاده کنید. از حالا به بعد، تمام URLpattern ها در این کتاب به صورت raw string خواهند بود. اکنون که توانستیم توسط یک URL چندین URL مختلف را در URLpattern پشتیبانی کنیم، این مشکل مطرح می شود که چگونه داده مورد نظر در URL را به تابع view انتقال دهیم، به طوری که توسط یک تابع view تمام ساعت ها را کنترل کنیم. این مشکل با قرار دادن پرانتز به دور داده ی مورد نظر در URLpattern قابل حل می باشد. برای مثال فوق، ما می خواهیم شماره ی وارد شده در URL را به تابع view انتقال دهیم، بنابراین عبارت \d{1,2} را درون پرانتز قرار می دهیم: (r'^time/plus/(\d{1,2})/$', hours_ahead), آخرین URLconf شامل دو تابع view قبلی می باشد: from django.conf.urls.defaults import * from mysite.views import hello, current_datetime, hours_ahead urlpatterns = patterns('', (r'^hello/$', hello), (r'^time/$', current_datetime), (r'^time/plus/(\d{1,2})/$', hours_ahead), ) ترتیب کد نویسی در مثال فوق، ابتدا URLpattern نوشته شد و بعد تابع view، اما در مثال های قبل از آن، ابتدا تابع view نوشته شد و بعد URLconf. کدام تکنیک بهتر است؟ روش هر توسعه دهنده متفاوت است. اگر شما از جمله افراد با مهارت هستید، ممکن است هنگام شروع پروژه ابتدا URLpattern های برنامه ی خود را نوشته و سپس به view های برنامه بپردازید. این روش به دلیل دادن به اصطلاح یک نوع لیست کاری واضح به شما مفید می باشد و اساسا پارامتر های مورد نیاز برای view را در ابتدای کار تعریف می کند. اگر شما از جمله برنامه نویسانی می باشید که دوست دارند از جزئیات به کلیات جلو بروند، ممکن است ترجیح بدهید ابتدا view ها را بنویسید و سپس URL ها را به آنها مرتبط کنید. این روش نیز مانند روش قبل می تواند مناسب باشد. در پایان، هر دو روش معتبر می باشند، هر کدام از روش ها که با فکر شما سازگار می باشد را می توانید بکار ببرید. حالا تابع hours_ahead را ایجاد خواهیم کرد که در URLconf با URL مورد نظر یعنی r'^time/plus/(\d{1,2})/$' مرتبط شده است. تابع hours_ahead بسیار شبیه به تابع current_datetime می باشد که در ابتدا نوشته شده است، با یک تفاوت کلیدی: تابع مذکور (hours_ahead) یک آرگومنت اضافه دریافت می کند، که شماره ی ساعت ها می باشد: from django.http import Http404, HttpResponse import datetime def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html) اجازه دهید کد فوق را مورد بررسی قرار دهیم: تابع view، hours_ahead، دو پارامتر دریافت می کند: request و offset. request همانطور که در تابع hello و current_datetime مشاهده کردید یک شیء HttpRequest می باشد. دوباره می گوییم که هر تابع view همیشه یک شیء HttpRequest به عنوان اولین پارامتر دریافت می کند. offset یک رشته است که داخل URLpattern درون پرانتز قرار گرفته است. به عنوان مثال، اگر URL درخواست شده /time/plus/3/ باشد، بنابراین offset رشته ی '3' خواهد بود. اگر URL درخواست شده /time/plus/21/ باشد، بنابراین offset رشته ی '21' خواهد بود. نکته اینکه مقدار که در URLpattern داخل پرانتز قرار گرفته شده است همواره رشته خواهد بود، نه Integer، حتی اگر رشته ی مورد نظر تنها از ارقام ساخته شده باشد مانند '21'. (از نظر فنی، مقدار درون پرانتز در URLpattern همواره شیء یونیکد می باشد، نه رشته ی ساده ی پایتون، ولی در حال حاضر درباره ی این فرق نگران نباشید.) در این مثال فوق متغیر مورد نظر offset نامیده شده است، شما می توانید آن را هر چیزی که دوست دارید نام گذاری کنید، البته هر نامی در محدوده ی نام گذاری متغیرهای پایتون. نام متغیر به هیچ وجه مهم نمی باشد، تنها چیز مهم این است که، این متغیر به عنوان دومین پارامتر تابع view بعد از request باشد. (همچنین می توان آنرا به صورت کلمه ی کلیدی نیز بکار برد که در آموزش view و urlconf پیشرفته درباره ی آن صحبت شده است.) اولین چیزی که درون تابع انجام شده است استفاده از int() و قرار دادن offset درون آن می باشد. این عمل مقدار یک رشته را به یک integer تبدیل می کند. توجه داشته باشید در صورتیکه پایتون قادر به تبدیل مقدار رشته به یک integer نباشد، به عنوان مثال اگر مقدار رشته چیزی شبیه به این باشد 'foo'، در این حالت خطای ValueError ایجاد خواهد شد. در مثال فوق، در صورتیکه برنامه با خطای ValueError برخورد کند، استثناء (exception) django.http.Http404 ایجاد خواهد شد، که نمایش صفحه ی خطای "Page not found" می باشد. خوانندگان هوشیار تعجب خواهند کرد که چگونه می توان به خطای ValueError رسید، در حالی که regular expression در URLpattern (\d{1,2}) تنها ارقام را قبول خواهد کرد، و offset همیشه تنها رشته ی ساخته شده از ارقام خواهد بود؟ جواب این است یک تابع view هیچگونه فرضی نسبت به پارامترهای ورودی خود در این حالت نخواهد کرد و با چک کردن مقدار متغیر درون تابع view به اصطلاح یک محکم کاری نسبت به مقدار متغیر ایجاد خواهد شد، همچنین اگر مبحث loosely coupling را به خاطر بیاورید تابع view جدای از URLconf به کار خود می پردازد. در خط بعدی از تابع، زمان و تاریخ فعلی محاسبه شده و شماره ساعت مناسب به آن اضافه شده است. عبارت datetime.datetime.now() را درون تابع current_datetime قبلا مشاهده کرده اید؛ مفهوم جدید در اینجا این است که می توانید با ساختن و اضافه کردن شیء datetime.timedelta به یک شیء datetime.datetime زمان و تاریخ را حساب کرده و نمایش دهید. در نهایت نتیجه این عمل درون متغیر dt ذخیره شده است. این خط دلیل استفاده از int() را نشان می دهد، چرا که برای استفاده از تابع datetime.timedelta باید پارامتر hours یک integer باشد. در قدم بعدی، یک خروجی HTML ساخته شده است، همانطور که در تابع current_datetime مشاهده کردید. تنها تفاوت این است که در اینجا از قابلیت format-string پایتون با دو مقدار استفاده شده است، نه یک مقدار. از این رو دو علامت %s درون رشته و یک تاپل برای درج مقدایر در انتها وجود دارد. نهایتا، یک HttpResponse از HTML برگردانده شده است. با تابع view و URLconf نوشته شده، سرور جنگو را (اگر در حال اجرا نمی باشد) اجرا کنید، و به منظور بررسی اینکه برنامه کار می کند یا خیر به آدرس http://127.0.0.1:8000/time/plus/3/ بروید. سپس به آدرس http://127.0.0.1:8000/time/plus/5/ رفته و همچنین آدرس http://127.0.0.1:8000/time/plus/24/ را نیز امتحان کنید. نهایتا به منظور بررسی اینکه الگوی شما تنها اعداد یک رقمی و دو رقمی را قبول می کند آدرس http://127.0.0.1:8000/time/plus/100/ را نیز امتحان کنید؛ جنگو باید خطای "Page not found" را در این مورد نمایش دهد. همچنین آدرس http://127.0.0.1:8000/time/plus/ (بدون هیچ ساعت تعیین شده ای) نیز باید باعث بروز خطای 404 شود. صفحات خطای جالب جنگو چند لحظه ای از برنامه های وبی که تاکنون ساخته ایم لذت ببرید ... حالا بیایید خرابشان کنیم! بیایید به طور عمد یکی از خطاهای پایتون را درون فایل views.py با کامنت کردن عبارت offset = int(offset) در hours_ahead معرفی کنیم. def hours_ahead(request, offset): # try: # offset = int(offset) # except ValueError: # raise Http404() dt = datetime.datetime.now() datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html) سرور جنگو را (اگر در حال اجرا نیست) اجرا کرده و به آدرس /time/plus/3/ بروید. یک صفحه ی خطا با یک مقدار قابل توجهی از اطلاعات را مشاهده خواهید کرد، که همچنین در بالای صفحه پیام TypeError نمایش داده شده است: "unsupported type for timedelta hours component: Unicode" چه اتفاقی افتاد؟ تابع datetime.timedelta انتظار دارد پارامتر hours یک integer باشد، و در کد فوق قسمتی از کد که offset را به integer تبدیل می کرد کامنت شده است، که باعث شده است در عبارت datetime.timedelta خطای TypeError ایجاد شود. هدف از این مثال نشان دادن صفحه ی خطای جنگو بود. مقداری درون صفحه ی خطا بگردید و با اطلاعات مختلف داده شده آشنا شوید. مسائل قابل توجهی در اینجا وجود دارند: در بالای صفحه، اطلاعات کلیدی در مورد استثناء (exception) بدست می آورید: نوع استثناء، پارامترهای استثناء (در این مورد پیام "unsupported type")، فایلی که استثناء در آن ایجاد شده است، و شماره ی خط آن. در زیر اطلاعات کلیدی استثناء، صفحه traceback کامل پایتون را برای این استثناء نمایش می دهد. این همانند traceback استانداردی است که در خط فرمان interpreter نشان داده می شود، که در اینجا حالت تعاملی بیشتری دارد. برای هر سطح ("frame") در توده های مشخص، جنگو نام فایل، نام متد/تابع، شماره ی خط، و سورس کد خط مورد نظر را نمایش می دهد. بر روی خط خاکستری تیره رنگ کد کلیک کنید، خط های قبل و بعد خطی که باعث بروز خطا شده است را مشاهده خواهید کرد. بر روی "local vars" در زیر هر frame کلید کنید تا جدول تمام متغیرهای محلی و مقادیرشان نشان داده شود. این اطلاعات اشکال زدایی می تواند یک کمک بزرگ برای هر توسعه دهنده باشد. بر روی "local vars" در زیر هر frame کلید کنید تا جدول تمام متغیرهای محلی و مقادیرشان نشان داده شود. این اطلاعات اشکال زدایی می تواند یک کمک بزرگ برای هر توسعه دهنده باشد. در قسمت پایین دکمه ی "Share this traceback on a public Web site" اطلاعات traceback را درون سایت dpaste: New تنها با یک کلیک کپی می کند و شما می توانید URL آن سایت را برای مشاهده ی traceback شما به دیگران بدهید. در قسمت پایین دکمه ی "Share this traceback on a public Web site" اطلاعات traceback را درون سایت dpaste: New تنها با یک کلیک کپی می کند و شما می توانید URL آن سایت را برای مشاهده ی traceback شما به دیگران بدهید. زیر قسمت "Request information"، بخش "Settings" قرار دارد که لیست تمام تنظیمات انجام شده ی جنگو می باشد. (قسمت ROOT_URLCONF پیش تر بیان شده است، و تنظیمات مختلف دیگر جنگو در سراسر کتاب نشان داده خواهد شد.) صفحه ی خطای جنگو برای نشان دادن اطلاعات بیشتر موارد ویژه، از قبیل خطاهای template syntax بسیار توانا می باشد. در زمان بحث در مورد سیستم tamplate جنگو به این موضوع خواهیم پرداخت. برای حالا، خط offset = int(offset) را از حالت کامنت خارج کنید تا تابع view بتواند دوباره کار کند. آیا شما از آن دسته از برنامه نویسانی هستید که دوست دارید برنامه ی خود را با قرار دادن عبارت print اشکال زدایی کنید؟ شما می توانید برای انجام چنین کاری بدون بکار بردن عبارت print از صفحه ی خطای جنگو استفاده کنید. در هر نقطه ای از view به صورت موقت یک assert False قرار دهید. سپس شما می توانید متغیرهای محلی و وضعیت برنامه را مشاهده کنید: def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() datetime.timedelta(hours=offset) assert False html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html) در پایان، واضح است که بسیاری از اطلاعات حساس هستند، و این موضوع که اطلاعات داخلی کد پایتون و تنظیمات جنگو را برای عموم نشان شود کاری ابلهانه می باشد. افراد مخرب می توانند با استفاده از این اطلاعات دست به کارهای نامطلوبی بزنند. به این دلیل، صفحه ی خطای جنگو تنها زمانی نمایش داده می شود که پروژه ی جنگو در حالت debug باشد. نحوه ی غیر فعال کردن حالت debug در فصل دوازدهم توضیح داده خواهد شد. در حال حاضر، دانستن اینکه هر پروژه ی جنگویی در هنگام ساخت به طور پیشفرض در حال debug می باشد. کافی است. خسته نباشید دوستان عزیز . جلسه سوم کتاب جنگو به پایان رسید . کار ترجمه این کتاب زیاد عالی نیست . ولی برای شروع بد نیست . امیدوارم که موفق باشید . برگرفته از سایت oruji.org ترجمه از سایت www.djangobook.com
  14. با سلام خدمت شما عزیزان با جلسه دوم کتاب جنگو در خدمت شما عزیزان هستیم . این کتاب برگرفته از سایت oruji.org می باشد . امیدوارم که لذت ببرید . هرگونه سوالی دارید در انجمن مربوط به این آموزش بپرسید . در ضمن عزیزانی که علاقه دارن آموزش انگلیسی این کتاب رو مطالعه کنند به آدرس وب سایت زیر مراجعه کنند : www.djangobook.com شروع کار با جنگو (Django) به علت بخش های متحرک چندگانه در محیط های توسعه وب امروزی، نصب کردن جنگو (Django) یک پردازش چند مرحله ای می باشد. در این فصل، به نحوه نصب جنگو فریم ورک وب پایتون (Python) و وابستگی های آن می پردازیم. از آن جهت که جنگو فقط کد پایتون می باشد، هرجایی که پایتون کار کند جنگو نیز کار خواهد کرد، که شامل برخی موبایل ها نیز می شود! اما این فصل تنها مراحل نصب جنگو را پوشش می دهد. فرض می کنیم شما در حال نصب آن روی یک دسکتاپ/نت بوک یا یک سرور هستید. نصب کردن پایتون خود جنگو از پایه با زبان پایتون نوشته شده است، بنابراین اولین قدم در نصب جنگو، نصب کردن پایتون بر روی سیستم می باشد. نسخه های پایتون هسته فریم ورک جنگو با نسخه های پایتون از 2.3 تا 2.7 کار می کند. اگر شما مطمئن نیستید که از کدام نسخه از پایتون استفاده کنید، آخرین نسخه در سری 2 را انتخاب کنید. هر چند جنگو به خوبی با نسخه‌های 2.3 تا 2.7 کار می‌ کند، آخرین نسخه از پایتون بهبودهایی در کارایی و همینطور خصوصیات اضافه‌تری دارد که ممکن است دوست داشته باشید در برنامه‌ی خود استفاده کنید. بنابراین استفاده از آخرین نسخه پایتون شما را در انتخاب آزاد می گذارد. جنگو و پایتون 3 در زمان نوشتن این کتاب، پایتون 3.0 منتشر شده است، اما جنگو هنوز از آن پشتیبانی نمی‌کند. پایتون 3.0 تعدادی تغییرات اساسی دارد که باعث ناسازگاری آن با نسخه‌های قبلی شده است، در نتیجه ما انتظار کتابخانه‌ها و فریم ورک‌های بیشتر را داریم، از جمله جنگو که تا چند سال آینده آن را جبران خواهد کرد. اگر شما در یادگیری پایتون تازه کار هستید و نگران این هستید که آیا باید از پایتون 2 یا 3 شروع کنید، ما توصیه می‌کنیم که با پایتون 2 شروع کنید. مراحل نصب اگر شما با سیستم عامل های لینوکس و یا مکینتاش کار می کنید، احتمالا پایتون را به صورت نصب شده در سیستم خود دارید. دستور python را در command prompt (یا در Applications/Utilities/Terminal) تایپ کنید. اگر شما چیزی شبیه به این مشاهده کردید، بنابراین پایتون نصب شده است. Python 2.4.1 (#2, Mar 31 2005, 00:05:10) [GCC 3.3 20030304 (Apple Computer, Inc. build 1666)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> در غیر اینصورت شما نیاز دارید تا پایتون را دانلود و نصب کنید. نصب آن بسیار آسان و سریع می باشد. همچنین دستورالعمل های نصب آن در آدرسDownload Python... در دسترس می باشد. در هر زمان دو نسخه متفاوت از جنگو در دسترس می باشد: آخرین نسخه رسمی و نسخه trunk. نسخه‌ای که شما تصمیم به نصب آن دارید به اولیت شما بستگی دارد. آیا شما یک نسخه تست شده و پایدار از جنگو را می خواهید، یا یک نسخه که حاوی آخرین خصوصیات باشد، و شاید شما بتوانید جنگو را برای خودتان گسترش دهید؟ توصیه می کنیم با نسخه رسمی شروع کنید، اما شناختن و دانستن این که نسخه توسعه trunk وجود دارد نیز مهم است، زیرا شما با عضو شدن در انجمن توسعه جنگو می توانید با مستندات جنگو و ساختن آن آشنا شوید. مراحل نصب انتشار رسمی جنگو انتشارهای رسمی دارای شماره نسخه می‌باشند، همانند 1.0.3 یا 1.1، و آخرین نسخه‌ی آن همیشه در این آدرس در دسترس است Download Django... اگر شما از یکی از توزیع‌های لینوکس استفاده می‌کنید که شامل یک پکیج آماده از جنگو است، ایده خوبی است که از نسخه توزیع‌کننده استفاده کنید. در این روش، شما آپدیت‌های امنیتی همراه با بقیه پکیج‌های سیستم را خودکار دریافت خواهید کرد. اگر شما به نسخه prepackaged دسترسی ندارید، می‌توانید به صورت دستی آن را دانلود کرده و نصب کنید. برای انجام چنین کاری، ابتدا باید پرونده tarball را که معمولا نامی مشابه Django-1.0.2-final.tar.gz دارد را دانلود کنید، سپس آن را از حالت فشرده خارج کرده و در خط فرمان setup.py install را اجرا کنید. نحوه عمل کردن در سیستم های یونیکس مشابه زیر است: tar xzvf Django-1.0.2-final.tar.gz cd Django-* sudo python setup.py install در سیستم عامل ویندوز استفاده از 7-Zip (http://www.djangoproject.com/r/7zip/) را توصیه می کنیم. فایل را از حالت فشرده خارج کرده و محیط DOS (Command Promt) را با دسترسی مدیر باز کرده و درون پوشه ای که با نام Django-1.0 ... شروع می‌شود دستور زیر را وارد کنید: python setup.py install فایل های جنگو درون پوشه site-packages برای فایل های نصب شده پایتون نصب خواهند شد، معمولا در این آدرس قرار دارد. usr/lib/python2.4/site-packages تست کردن نصب جنگو بعد از نصب جنگو برای اینکه اطمینان حاصل کنید جنگو به درستی نصب شده و کار می‌کند، درون خط فرمان به شاخه‌ی دیگری بروید (به طور مثال، شاخه‌ای که شامل شاخه‌ی django نباشد) و interactive interpreter پایتون را با تایپ کردن python اجرا کنید. اگر نصب با موفقیت انجام شده باشد، شما باید قادر به import کردن ماژول جنگو باشید: >>> import django >>> django.VERSION (1, 1, 0, 'final', 1) مثال های Interactive Interpreter interactive interpreter پایتون یک برنامه خط فرمان است که به شما اجازه می‌دهد تا کدها و برنامه‌های پایتون را به صورت تعاملی بنویسید. برای شروع کار با آن، تنها کافی است دستور python را در خط فرمان اجرا کنید. در سرتاسر این کتاب، از بخش های interactive interpreter پایتون استفاده شده است. شما می توانید این مثال ها را با سه علامت بزرگتر (<<<) تشخیص دهید. اگر می خواهید این کدها را کپی کنید، نباید علامت های بزرگتر را انتخاب کنید. جملات چند خطی در interactive interpreter با استفاده از سه نقطه (...)، مشخص می شوند: >>> print """This is a ... string that spans ... three lines.""" This is a string that spans three lines. >>> def my_function(value): ... print value >>> my_function('hello') hello این سه نقطه در شروع دستورات چند خطی بوسیله shell پایتون ایجاد می شوند، یعنی جزء بخش هایی نیست که ما وارد کرده باشیم. آغاز یک پروژه هنگامی که شما پایتون، جنگو و (به طور اختیاری) دیتابیس خود را نصب کردید، شما می توانید اولین گام را در توسعه یک برنامه جنگو، با ساختن یک پروژه بردارید. یک پروژه مجموعه ای از تنظیمات برای یک نمونه از جنگو، شامل تنظیمات دیتابیس، گزینه های ویژه جنگو و برنامه ویژه تنظیمات می باشد. اگر این اولین باری است که از جنگو استفاده می کنید، شما باید مراقب بعضی از تنظیمات اولیه باشید. یک پوشه جدید برای شروع کار بسازید، شاید چیزی شبیه به این/home/username/djcode/. این پوشه باید کجا قرار بگیرد اگر زمینه فکری شما PHP باشد، شاید درون document root سرور (جایی مانند /var/www) کد خود را قرار دهید. موقع کدنویسی با جنگو، این کار را انجام ندهید. این ایده خوبی نیست که هر کد پایتونی را داخل document root سرور قرار دهید، زیرا در این حالت این ریسک وجود دارد که امکان دارد بقیه قادر شوند کد خام شما را درون وب تماشا کنند و این خوب نیست. کد خود را در یک پوشه ای بیرون از document root قرار دهید. به مسیر پوشه ای که ساخته اید رفته، و دستور django-admin.py startproject mysite را اجرا کنید. دستور فوق پوشه mysite را درون پوشه ای که قرار دارید می سازد. اگر شما پیام "permission denied" را هنگام اجرا کردن django-admin.py startproject مشاهده کردید، شما نیاز خواهید داشت حق دسترسی فایل را تغییر دهید. برای این منظور، به پوشه ای که django-admin.py در آن نصب شده است رفته (مانند /usr/local/bin) و دستور chmod x django-admin.py را اجرا کنید. دستور startproject یک پوشه حاوی چهار فایل می سازد: mysite/ __init__.py manage.py settings.py urls.py وضیح فایل های بالا در زیر آمده است: __init__.py: یک فایل مورد نیاز پایتون می باشد که توسط آن پوشه mysite یک پکیج تلقی می شود. همچنین فایل فوق یک فایل خالی می باشد، و معمولا شما هیچ چیزی درون آن اضافه نخواهید کرد. manage.py: یک مزیت خط فرمان می باشد که به شما اجازه می دهد با این پروژه جنگو در روش های مختلف در تعامل باشید. دستور python manage.py help را تایپ کنید تا آنچه را که می توانید با این فایل انجام دهید را مشاهده کنید. شما نباید هرگز این فایل را ویرایش یا دستکاری کنید این فایل صرفا برای راحتی کار در این پوشه ساخته شده است. settings.py: تنظیمات/پیکربندی برای پروژه جنگو می باشد. نگاهی به آن بیاندازید تا تنظیمات در دسترس، به همراه مقادیر پیشفرض آن را مشاهده کنید. urls.py: URL ها برای پروژه جنگو. برای لحظاتی فکر کنید فهرست مطالب سایت شما خالی باشد.با وجود حجم کم، این فایل ها کارکرد برنامه جنگو را تشکیل می دهند. با وجود حجم کم، این فایل ها کارکرد برنامه جنگو را تشکیل می دهند. اجرا کردن سرور سرور جنگو (همچنین runserver هم نامیده می شود بعد از دستور راه اندازی آن) یک سرور سبک و داخلی جنگو می باشد که شما می توانید با استفاده از آن سایت خود را توسعه دهید. با استفاده از این سرور شما می تونید به سرعت سایت خود را توسعه دهید، بدون سر و کارداشتن با تنظیمات سرور (مانند Apache) تا زمانی که شما آماده شوید برای راه اندازی سایت. این سرور به طور اتوماتیک هنگامی که شما در کد خود تغییر ایجاد می کنید آن تغییرات را در خودش بروز سازی می کند بدون اینکه شما نیازی به راه اندازی مجدد آن پیدا کنید. برای اجرا کردن سرور، به درون پوشه پروژه رفته (cd mysite)، و دستور زیر را اجرا کنید: python manage.py runserver شما چیزی شبیه به این خواهید دید: Validating models... 0 errors found. Django version 1.0, using settings 'mysite.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C. دستور بالا سرور را به صورت داخلی روی پورت 8000 راه اندازی می کند، که تنها بر روی رایانه شما قابل دسترس خواهد بود. حالا که سرور در حال اجراست، مسیر http://127.0.0.1:8000/ را روی مرورگر خود مشاهده کنید. شما یک صفحه مانند شکل 1-2 مشاهده خواهید کرد. شکل 1-2 در پایان، نکته مهمی که درباره سرور خود جنگو می باشد را بیان می کنیم، اگر چه این سرور برای توسعه مناسب می باشد، ولی در یک زمان تنها می تواند یک درخواست (request) جواب گو باشد، و همچنین از نظر امنیتی نیز کامل نیست. اطلاعات بیشتر در مورد این موضوع در فصل دوازدهم بیان شده است. تغییر دادن هاست یا پورت به طور پیشفرض، دستور runserver سرور را روی پورت 8000 اجرا می کند، که تنها برای اتصالات محلی می باشد. اگر پورت سرور را تغییر دهید، آنرا به صورت آرگومان به خط فرمان ارسال کنید. python manage.py runserver 8080 با تعیین آدرس IP، شما می توانید به سرور بگویید تا به اتصالات غیر محلی (non-local) اجازه اتصال دهد. این بویژه زمانی مفید خواهد بود که شما بخواهید سایت را با دیگر اعضای تیم خود به اشتراک بگذارید. IP آدرس 0.0.0.0 به سرور می گوید به هر رابط شبکه گوش کن: python manage.py runserver 0.0.0.0:8000 هنگامی که شما دستور فوق را اجرا کنید، رایانه های دیگر در شبکه محلی شما قادر خواهند بود سایت جنگوی شما را با آدرس IP شما در مرورگر خود تماشا کنند، مانند http://192.168.1.103:8000/. (نکته این که شما باید تنظیمات شبکه خودتان را برای تعیین آدرس IP خودتان روی شبکه محلی داشته باشید. کاربران یونیکس، باید سعی کنند ifconfig را در یک خط فرمان برای گرفتن اطلاعات اجرا کنند. کاربران ویندوز باید با دستور ipconfig این کار را انجام دهند.) خسته نباشید دوستان عزیز . جلسه دوم کتاب جنگو به پایان رسید . کار ترجمه این کتاب زیاد عالی نیست . ولی برای شروع بد نیست . امیدوارم که موفق باشید . برگرفته از سایت oruji.org ترجمه از سایت www.djangobook.com
  15. این تاپیک پشتیبانی برای آموزش است کتاب جنگو - شروع کار ( جلسه دوم ) 24/03/96 15:56 24/03/96 16:08 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.
  16. با سلام خدمت شما عزیزان با جلسه اول کتاب جنگو در خدمت شما عزیزان هستیم . این کتاب برگرفته از سایت oruji.org می باشد . امیدوارم که لذت ببرید . هرگونه سوالی دارید در انجمن مربوط به این آموزش بپرسید . در ضمن عزیزانی که علاقه دارن آموزش انگلیسی این کتاب رو مطالعه کنند به آدرس وب سایت زیر مراجعه کنند : www.djangobook.com مقدمه : جنگو چیست ؟ این کتاب درباره جنگو (Django) - فریم ورک وب پایتون (Python) می باشد که از نظر سرعت و قدرت بسیار کارا بوده و کار کردن با آن بسیار لذت بخش می باشد. با استفاده از جنگو شما می توانید با حداقل تلاش برنامه های تحت وب با کیفیت بالا ایجاد و پشتیبانی کنید. توسعه وب در صورتی که درست انجام پذیرد یک کار هیجان انگیز و خلاق است، اما در صورتی که اصولی انجام نپذیرد می تواند تکراری، خسته کننده و حتی آزار دهنده باشد. جنگو به شما این اجازه را می دهد که بروی چیزهایی خارج از دوباره نویسی قسمت های تکراری تمرکز کنید. برای این منظور، جنگو الگوهای خاصی از قبیل کلیدهای میانبر برای عملیات های تکراری و غیره ... را ایجاد کرده است. همچنین جنگو به شما اجازه می دهد تا خارج از محدوده فریم ورک نیز در صورت نیاز کار کنید. هدف این کتاب تربیت توسعه دهندگان حرفه ای جنگو می باشد. کتاب به دو موضوع توجه دارد. اول اینکه، ما به صورت عمقی نحوه عملکرد جنگو و طریقه ساختن برنامه های تحت وب با آن را توضیح می دهیم. دوم، در ادامه ما در مورد مفاهیم پیشرفته تر بحث خواهیم کرد. از طریق خواندن این کتاب، شما مهارت مورد نیاز برای توسعه وب سایت های پر قدرت با سرعت زیاد را کسب خواهید نمود. یک فریم ورک وب چیست ؟ جنگو یک فریم ورک جدید و برجسته وب است، اما معنی دقیق یک فریم ورک چیست؟ برای جواب دادن به سوال بالا، اجازه دهید طرح یک برنامه وب نوشته شده در پایتون را بدون استفاده از فریم ورک بررسی کنیم. در سراسر این کتاب، ما این رویکرد را دنبال می کنیم که روش های پایه و بدون استفاده از میانبر (shortcuts) را نشان داده، با این امید که شما به این تشخیص برسید که چرا کلید های میانبر بسیار مفید می باشند. (همچنین عدم استفاده از میانبرها (shortcuts) به جهت دیگری مفید می باشد زیرا آنها همیشه در دسترس نمی باشند. مهمتر از همه، دانستن اینکه برنامه به چه طریق کار می کند در بالا بردن مهارت شما بسیار موثر است.) یکی از آسان ترین روش های ساخت یک برنامه وب پایتون، استفاده از CGI می باشد، که در حدود سال های 1998 محبوب بود. تنها کافی است یک اسکریپت پایتون که خروجی HTML تولید می کند نوشته، سپس اسکریپت را با پسوند ".cgi" درون وب سرور ذخیره کنید و در آخر نیز صفحه را درون مرورگر خود مشاهده کنید. در اینجا یک مثال اسکریپت CGI پایتون وجود دارد که ده کتاب پایانی منتشر شده را از دیتابیس خوانده و نمایش می دهد. تنها کافیست کلیات عملیاتی که در کد زیر انجام شده است را دریابید و نگران جزئیات کد زیر نباشید. #!/usr/bin/env python import MySQLdb print "Content-Type: text/html\n" print "<html><head><title>Books</title></head>" print "<body>" print "<h1>Books</h1>" print "<ul>" connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10") for row in cursor.fetchall(): print "<li>%s</li>" % row[0] print "</ul>" print "</body></html>" connection.close() در ابتدا، برای تکمیل نیازمندی های CGI، در خط 5 عبارت "Content-Type" و به دنبال آن یک خط خالی چاپ شده است. در خط 5 تا 9 نیز کدهای مربوط به HTML چاپ شده، سپس به دیتابیس وصل شده و یک پرس و جو برای بازیابی اسامی ده کتاب آخر اجرا شده است. در خط 15 با یک حلقه لیست کتاب ها نمایش داده شده است و در آخر نیز HTML و connection دیتابیس بسته شده است. فهمیدن کد بالا بسیار ساده است. حتی یک برنامه نویس مبتدی نیز می تواند این خطوط را خوانده و هر آنچه از بالا تا پایین انجام می گیرد را بفهمد. همچنین اجرای این کد نیز ساده می باشد، تنها کافی است کد را با پسوند ".cgi" ذخیره کرده و آنرا در وب سرور قرار دهید و توسط مرورگر آدرس آن را فراخوانی کنید. اما با وجود تمام این سادگی ها، در استفاده کلی از روش بالا ممکن است با مسائل و مشکلاتی روبه رو شویم. به عنوان مثال به سوالات زیر توجه کنید: *** چه اتفاقی می افتد اگر چندین بخش از برنامه شما نیاز داشته باشند به دیتابیس وصل شوند؟ مطمئنا کد مربوط به اتصال به دیتابیس نیازی نیست در CGI اسکریپت ها به صورت منحصر به فرد تکرار شود. واقع بینانه این است که کد مربوط درون یک تابع به اشتراک گذاشته شده و بارها فراخوانده شود. آیا یک توسعه دهنده (developer) باید در مورد چاپ کردن خط "Content-Type" و بیاد آوردن بستن connection دیتابیس همواره نگرانی داشته باشد؟ این قبیل مسائل باعث کاهش باروری برنامه نویس و بالا رفتن احتمال اشتباه می شود. *** چه اتفاقی می افتد هنگامی که این کد در محیط های مختلف برای دیتابیس های مختلف استفاده شود؟ در این صورت تنظیمات مختلف برای هر دیتابیس و محیط یک امر ضروری می باشد. *** چه اتفاقی می افتد هنگامی که یک طراح وب، کسی که هیچ آشنایی و تجربه ای در مورد کد پایتون ندارد بخواهد صفحه را دوباره طراحی کند؟ ایده آل آن است که منطق مربوط به قسمت های خواندن اطلاعات از دیتابیس و نمایش آنها از هم جدا شوند، و اطلاعات خوانده شده درون یک صفحه Html نمایش داده شود تا طراح بتواند صفحه را طراحی کند. این مشکلات دقیقا مسائلی می باشند که یک فریم ورک وب قصد حل کردن آن را دارد. یک فریم ورک وب درست مانند یک زیرساخت برای برنامه های شماست، به طوری که بتوانید به روی تمیز برنامه نوشتن یا کد قابل اصلاح بدون دوباره نویسی تمرکز کنید، خلاصه اینکه جنگو تمام وظایف ذکر شده را انجام می دهد. الگوی طراحی MVC بیایید یک مثال که تفاوت بین روش قبلی و روش با استفاده از فریم ورک وب را نشان می دهد را مورد بررسی قرار دهیم. در اینجا نحوه نوشتن کد قبلی CGI را با استفاده از جنگو نشان داده شده است. اولین چیزی که باید توجه کنید این است که ما عملیات انجام شده در کد قبلی را در سه فایل پایتون (models.py، views.py، urls.py) و یک فایل HTML (latest_books.html) از هم جدا کرده ایم: # models.py (the database tables) from django.db import models class Book(models.Model): name = models.CharField(max_length=50) pub_date = models.DateField() # views.py (the business logic) from django.shortcuts import render_to_response from models import Book def latest_books(request): book_list = Book.objects.order_by('-pub_date')[:10] return render_to_response('latest_books.html', {'book_list': book_list}) # urls.py (the URL configuration) from django.conf.urls.defaults import * import views urlpatterns = patterns('', (r'^latest/$', views.latest_books), ) # latest_books.html (the template) <html> <head> <title>Books</title> </head> <body> <h1>Books</h1> </ul> {% for book in book_list %} <li>id="19"<li/> {{ book.name }} {% endfor %} </ul> </body> </html> دوباره، درباره کد بالا و کارکرد آن نگران نباشید؛ تنها پیدا کردن فهم کلی نسبت به طراحی آن کافی است. نکته اصلی مورد توجه اینجا قسمت های مختلف جدا شده از هم می باشد: فایل models.py حاوی یک توضیح از جدول دیتابیس می باشد که بصورت کلاس پایتون نمایش داده شده است. این کلاس یک model نامیده می شود. با استفاده از آن شما می توانید رکوردهای درون دیتابیس را با استفاده از کد ساده پایتون ساخته، بازیابی، به روز سازی و حذف کنید. فایل views.py حاوی منطق های برنامه نویسی برای صفحه می باشد. تابع latest_books() با نام view شناخته می شود. فایل urls.py نسبت به url داده شده view مورد نظر را تعیین می کند. در مثال فوق /latest/ با تابع latest_book() مرتبط خواهد شد. به زبان ساده تر، اگر دامنه شما example.com است، هر بازدیدی از آدرس http://example.com/latest/ تابع latest_book() را فراخوانی خواهد کرد. فایل latest_books.html یک قالب HTML است که طرح صفحه در آن قرار می گیرد. این قالب از یک زبان template با جملات منطقی پایه مانند {% for book in book_list %} استفاده می کند. قسمت های فوق یک الگو را دنبال می کنند که Model-View-Controller یا (MVC) نامیده می شود. به عبارت ساده MVC یک روش برای توسعه دادن نرم افزار است به طوری که کد برای تعریف کردن و دسترسی داشتن داده (the model) از منطق (the controller) جدا شده و آن نیز از رابط کاربر (the view) جدا می باشد. (ما در مورد MVC در آموزش مدل جنگو به طور مفصل بحث خواهیم کرد.) مزیت های کدنویسی به روش MVC مزیت کلیدی روش MVC این است که اجزا نسبت به یکدیگر به اصطلاح loosely coupled هستند. بدین معنا که هر قسمت مجزا از برنامه تحت وب جنگو هدف خاص خود را دارد و می تواند بدون تاثیربر روی دیگر قسمت ها به طور مستقل تغییر کند. به عنوان مثال، یک توسعه دهنده می تواند مسیر یک بخش داده شده از برنامه را بدون تاثیر بر روی اصل برنامه تغییر دهد. یک طراح می تواند صفحه HTML را بدون کار کردن با کد پایتون تغییر داده و تحویل دهد. یک مدیر دیتابیس می تواند جداول درون دیتابیس را تغییر نام داده و هر تغییری را درون یک قسمت خاص بدهد. در این کتاب، هر بخش از MVC درون فصل خود بحث شده است. آموزش view و urlconf جنگو views را پوشش می دهد، آموزش template جنگو templates را و آموزش مدل جنگو نیز models را پوشش می دهد. تاریخچه جنگو پیش تر ما درون کدها به بررسی پرداختیم، همچنین ما باید مقداری به توضیح تاریخچه Django بپردازیم. در قبل گفته شد که ما نحوه کارکردن قسمت ها بدون استفاده از میانبرها را نشان خواهیم داد به طوری که شما فهم و درک بیشتری برای مفید بودن میانبرها پیدا کنید. همینطور فهمیدن اینکه جنگو به چه دلایلی ساخته شده است نیز مفید خواهد بود. اگر شما برای مدتی برنامه تحت وب ساخته باشید، شاید با مشکلات CGI، مانند مثال قبلی کتاب که پیش تر توضیح داده شد، آشنا شده باشید. مسیر توسعه دهندگان وب شکلی شبیه به این داشته است: 1- نوشتن یک برنامه وب از ابتدا. 2- نوشتن یک برنامه دیگر از ابتدا. 3- پی بردن به اینکه برنامه در گام اول اشتراکات عمومی زیادی با برنامه در گام دوم دارد. 4- تغییر کد به طوری که برنامه اول بتواند کد خود را با برنامه دوم به اشتراک بگذارد. 5- تکرار کردن گام های 2-4 به صورت چند بار. 6- درک کردن ساخت یک فریم ورک. این دقیقا نحوه ساخته شدن فریم ورک است جنگو از برنامه های real-word نوشته شده توسط تیم توسعه دهندگان وب در لارنس، کانزاس آمریکا رشد کرد. جنگو در پاییز سال 2003 متولد شد، هنگامی که برنامه نویسان وب در روزنامه Journal-World، آدریان هولاوتی و سیمون ویلیسون استفاده از پایتون را برای ساختن برنامه ها شروع کرده بودند. تیم World Online مسئولیت تولید و نگهداری چندین سایت اخبار محلی را به عهده داشت، که در یک محیط کاری همراه با ضرب العجل های روزنامه نگاری رشد کرده بود. برای سایت های LJWorld.com، Lawrence.com، و KUsports.com روزنامه نگاران و مدیران خصوصیات جدیدی با برنامه کاری به شدت پر سرعت را درخواست کردند. در نتیجه سیمون و آدریان یک فریم ورک توسعه وب با صرفه جویی در زمان را توسعه دادند که آن تنها راهی بود که می توانستند برنامه های قابل پشتیبانی در ضرب العجل های سریع را بسازند. در تابستان سال 2005، بعد از توسعه این فریم ورک، جایی که برای ایجاد سایت های World Online بیشترین تاثیر را داشت، و همچنین هنگامی که جاکُب کاپلان مُس، به آنها ملحق شد، تصمیم گرفته شد فریم ورک به صورت نرم افزار کد باز (open source) منتشر شود. آنها فریم ورک خود را در جولای سال 2005 با نام جنگو منتشر کردند، به یادبود گیتاریست سبک جاز "جنگو رینهارت". حالا چندین سال بعد، جنگو یک پروژه کد باز خیلی مشهور با ده ها هزار کاربر و حامی پخش شده در سراسر دنیا می باشد. دو تن از توسعه دهندگان اصلی World Online (آدریان و جاکُب) هنوز هدایت مرکزی برای رشد فریم ورک را انجام می دهند، اما Django حاصل تلاش و همکاری فراوان کل گروه است. این تاریخچه مربوط به بحث می باشد زیرا به توضیح دو موضوع کلیدی کمک می کند. اول موقعیت خوب جنگو. از آنجایی که جنگو در یک محیط اخبار متولد شده است، می تواند خصوصیات مختلفی از قبیل سایت مدیر، (که در سایت مدیر به آن پرداخته شده است)را ارائه دهد که به ویژه برای سایت های محتوی (content) مانند Amazon.com، craigslist.org و washingtonpost.com که اطلاعات پویا را ارائه می دهند، مناسب می باشند. البته این بدان معنی نیست که Django فقط برای توسعه دادن آن دسته از سایت ها خوب می باشد، اما این موضوع مانعی برای موثر بودن جنگو برای ساختن انواع دیگر وب سایت های پویا نمی باشد. (بین موثر بودن در چیزی به طور ویژه و بی تاثیر بودن در بقیه چیزها تفاوت بسیار است.) موضوع دوم ریشه های جنگو می باشد که دارای فرهنگ انجمن کد باز است، زیرا جنگو یک محصول تجاری و یا تجربیات دانشگاهی نیست بلکه کدی می باشد که از دنیای واقعی استخراج شده است و به طور عمیق بر روی حل مشکلات توسعه وب تمرکز کرده است. طریقه خواندن کتاب جنگو : در نوشتن این کتاب، ما سعی کرده ایم یک تعادل بین خوانایی و مرجع بودن برقرار نماییم، البته با تعصب نسبت به خوانایی. هدف ما در این کتاب، همانطور که قبلا گفته شد، حرفه ای کردن شما در جنگو می باشد، همچنین ما اعتقاد داریم بهترین روش برای آموزش توضیح به زبان ساده و استفاده از مثال های فراوان به جای تهیه کردن یک لیست کامل از خصوصیات جنگو می باشد. (شما نمی توانید انتظار داشته باشید تنها با آموختن حروف الفبا به کسی بتوانید نحوه صحبت کردن را به او بیاموزید.) با در نظر گرفتن این، ما توصیه می کنیم که فصل های اول تا دوازده را به ترتیب به طور کامل بخوانید. این فصل ها پایه و اساس جنگو و نحوه استفاده از آن را تشکیل می دهند. تنها با خواندن این دوازده فصل شما قادر به ساختن و گسترش وب سایت ها با استفاده از جنگو خواهید بود. به طور خاص فصل های اول تا هفتم هسته جنگو، فصل های هشتم تا یازدهم استفاده های پیشرفته از جنگو، و فصل دوازدهم گسترش (deployment) را پوشش می دهند. فصل های باقیمانده، سیزدهم تا بیستم، بر روی خصوصیات ویژه جنگو می باشد. دانش مورد نیاز برنامه نویسی : خوانندگان این کتاب باید قوائد برنامه نویسی شیءگرا را بدانند: ساختار های کنترلی (مانند، if، while، for)، ساختارهای داده (lists، hashes/dictionaries)، متغیرها، کلاس ها و شیء ها (objects). ممکن است شما فکر کنید تجربه در توسعه وب می تواند بسیار مفید باشد، اما این موضوع یک پیش نیاز برای فهم این کتاب نیست. در سرتاسر این کتاب، ما سعی کردیم از بهترین تمرین ها در توسعه وب برای خوانندگانی که تجربه کمی دارند استفاده کنیم. دانش مورد نیاز پایتون : جنگو مجموعه ای از کتابخانه های نوشته شده با زبان برنامه نویسی پایتون می باشد. برای گسترش یک سایت با استفاده از Django، شما کد پایتونی می نویسید که از این کتابخانه ها استفاده می کند. یاد گرفتن جنگو ترکیبی از دانستن نحوه نوشتن برنامه به زبان پایتون و فهمیدن کار کتابخانه های جنگو می باشد. خسته نباشید دوستان عزیز . جلسه اول کتاب جنگو به پایان رسید . کار ترجمه این کتاب زیاد عالی نیست . ولی برای شروع بد نیست . امیدوارم که موفق باشید . برگرفته از سایت oruji.org ترجمه از سایت www.djangobook.com
  17. این تاپیک پشتیبانی برای آموزش است کتاب جنگو - مقدمه ( جلسه اول ) 23/03/96 21:34 23/03/96 21:39 لطفا اگرهر سوال یا بازخوردی دارید اینجا ارسال کنید.