• Django+Nginx+uwsgi搭建自己的博客(一)


    最近对写爬虫有些厌倦了,于是将方向转移到了Web开发上。其实在之前自己也看过一部分Flask的资料,但总觉得Flask的资料有些零散,而且需要的各种扩展也非常多。因此,我将研究方向转移到了另一个主流的框架——Django上。

    与Flask框架相比,Django框架提供了更全面的文档支持,其初始教程也很容易上手。而且,相比Flask,Django并不需要很多扩展的支持,其自身就提供了很多便利的类。个人感觉这两点使得学习Django比学习Flask更容易上手。

    目前,Python3已经成为了主流版本,因此此文采用Python3.5进行开发。

    环境:Ubuntu16.04+Python3.5

    首先看一下目前的成果:

    首页列出了当前所有博客的列表,包括作者,阅读量以及发表时间;在页面左上角是用户名以及该用户的头像,而右边可以退出登录以及发表博文。

    点击博文,可以浏览到博文内容,以及发表评论并查看评论。

    点击已注册的用户名,可以查看到该用户的相关资料。

    下面来介绍Django的几个基本概念:Project, App, Model, View

    Project和App: 一个Django project即是一个网站,而App可以看为网站中的子功能。一个project里可以包含多个App,通过这些App的共同作用来实现网站的功能。

    Model: 即数据库表模型。Django默认采用sqlite3作为数据库,每个App都会建立自己的表,定义在App目录下的models.py文件里。

    View: 视图类,定义在App目录下以及project目录下的views.py中,存储访问页面时的相关操作。

    通常来说,当我们想要建立一个Django网站时,可以执行以下命令创建:

    1. python3 django-admin.py startproject myblog  
    python3 django-admin.py startproject myblog
    有可能会出现找不到django-admin.py文件的错误,这时有两个选择:1. 把django-admin.py加入PATH环境变量;2. 在当前目录下建立django-admin.py的软连接:
    1. ln -s python第三方库路径/django-admin.py ./django-admin.py  
    ln -s python第三方库路径/django-admin.py ./django-admin.py
    可以使用
    1. python3 -m site  
    python3 -m site
    命令查看python3的第三方库目录。

    这时django会自动创建文件夹以及相关文件:

    1. ├── manage.py  
    2. └── myblog  
    3.     ├── __init__.py  
    4.     ├── settings.py  
    5.     ├── urls.py  
    6.     └── wsgi.py  
    ├── manage.py
    └── myblog
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

    (由于现在的myblog目录已经有了很多文件了,因此我新建了一个工程来展示目录结构)

    在这些文件中,manage.py是一个主要的控制文件,如建立数据库表,更新数据库表结构以及启动测试服务器都需要通过这个文件来进行;settings.py存储了网站整体的一些配置;urls.py用于在以后建立views和url的映射关系,而wsgi.py用于以后的nginx与uwsgi的部署。

    对于这个个人博客网站来说,我们需要两个app: blogs和users。前者用于管理与博客有关的相关操作,而后者用于管理与用户有关的操作。

    在mysite目录下,运行

    1. python3 manage.py startapp users  
    python3 manage.py startapp users

    来建立第一个App——users,我们通过这个App来实现管理用户的相关操作。

    users App的目录结构如下:

    1. ├── admin.py  
    2. ├── apps.py  
    3. ├── __init__.py  
    4. ├── migrations  
    5. │   └── __init__.py  
    6. ├── models.py  
    7. ├── tests.py  
    8. └── views.py  
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py
    models.py里决定了Users app的表结构,views.py里将会定义Users相关的视图类。

    打开models.py,添加如下代码:

    1. from django.db import models  
    2. import datetime  
    3. import PIL  
    4. # Create your models here.  
    5. class Users(models.Model):  
    6.     username = models.CharField(max_length=8,primary_key=True,unique=True)  
    7.     password = models.CharField(max_length=16)  
    8.     logoimage = models.ImageField(upload_to='logoimages',null=True)  
    9.     # new field  
    10.     birthday = models.DateTimeField(null=True,blank=True)  
    11.     email = models.CharField(max_length=255,null=True,blank=True)  
    12.     mobilephone = models.CharField(max_length=11,null=True,blank=True)  
    13.     # new field end  
    14.     registertime = models.DateTimeField()  
    15.  
    16.     @classmethod  
    17.     def create(cls,username,password,birthday,email,mobilephone):  
    18.         user = cls(username=username,password=password,birthday=birthday,  
    19.                    email=email,mobilephone=mobilephone,registertime=datetime.datetime.now())  
    20.         return user  
    21.   
    22.     def __unicode__(self):  
    23.         return self.username  
    from django.db import models
    import datetime
    import PIL
    # Create your models here.
    class Users(models.Model):
        username = models.CharField(max_length=8,primary_key=True,unique=True)
        password = models.CharField(max_length=16)
        logoimage = models.ImageField(upload_to='logoimages',null=True)
        # new field
        birthday = models.DateTimeField(null=True,blank=True)
        email = models.CharField(max_length=255,null=True,blank=True)
        mobilephone = models.CharField(max_length=11,null=True,blank=True)
        # new field end
        registertime = models.DateTimeField()
    
        @classmethod
        def create(cls,username,password,birthday,email,mobilephone):
            user = cls(username=username,password=password,birthday=birthday,
                       email=email,mobilephone=mobilephone,registertime=datetime.datetime.now())
            return user
    
        def __unicode__(self):
            return self.username
    在这个model里,我们建立了名为Users的表,包含username, password, logoimage, birthday, email, mobilephone和registertime这几个字段,并且以username为主键。

    我们还创建了create类方法,用于在以后的注册用户功能中调用。

    定义的__unicode__方法使得用户可以在django提供的admin页面中查看已有的用户。

    在编写好users的model后,我们打开myblog目录下的setting.py,在其中INSTALLED_APPS加入'users.apps.UsersConfig'一项,把该App注册到网站中。

    随后在myblog目录下运行

    1. python3 manage.py makemigrations users  
    python3 manage.py makemigrations users
    1. python3 manage.py migrate  
    python3 manage.py migrate
    这两条命令,在默认的sqlite数据库里建立Users表。
    可以通过命令
    1. sqlite3 你的db文件名称  
    sqlite3 你的db文件名称
    打开你所建立的db,后输入.table命令查看当前数据库中的所有表,如下所示:
    1. sqlite3 blog.sqlite   
    2. SQLite version 3.11.0 2016-02-15 17:29:24  
    3. Enter ".help" for usage hints.  
    4. sqlite> .table  
    5. auth_group                  blogs_category              
    6. auth_group_permissions      blogs_comment               
    7. auth_permission             django_admin_log            
    8. auth_user                   django_content_type         
    9. auth_user_groups            django_migrations           
    10. auth_user_user_permissions  django_session              
    11. blogs_blog                  users_users    
    sqlite3 blog.sqlite 
    SQLite version 3.11.0 2016-02-15 17:29:24
    Enter ".help" for usage hints.
    sqlite> .table
    auth_group                  blogs_category            
    auth_group_permissions      blogs_comment             
    auth_permission             django_admin_log          
    auth_user                   django_content_type       
    auth_user_groups            django_migrations         
    auth_user_user_permissions  django_session            
    blogs_blog                  users_users  
    其中,以django_和auth_开头的为django自己的系统表,而用户定义的表以App名称_类名称作为表名,如users_users,blogs_blog,blogs_category等。

    这样,我们的第一个App的表就建好了,在之后的博文中会继续介绍网站的其他部分内容。

    (未完待续)

  • 相关阅读:
    P1219 [USACO1.5]八皇后 Checker Challenge 深度搜索 标记 回溯
    P2036 [COCI2008-2009#2] PERKET 深度搜索 暴力
    20201122 赛事纪录
    P4447 [AHOI2018初中组]分组 贪心
    P4995 跳跳! 贪心
    P1434 [SHOI2002]滑雪 记忆化搜索,深度搜索,动态规划
    leetcode(42)接雨水
    数据结构与算法的总纲
    leetcode(84)柱状图中最大的矩形
    leetcode(45)跳跃游戏
  • 原文地址:https://www.cnblogs.com/xiaoyaojinzhazhadehangcheng/p/8353200.html
Copyright © 2020-2023  润新知