奇幻网站搭建环境和模型设计


第一章 搭建环境

1    在本地电脑上创建一个项目文件夹:qihuan_website

2     github创建项目,名为qihuan_website,然后将项目clone到本地文件夹qihuan_website.

    如何克隆,参考 廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

3     创建本地虚拟环境:

    我使用的是window7电脑,本机安装了python3.        

        3.1 cmd命令行切换到该文件夹下创建虚拟环境python3_venv:

            $ python -m venv python3_venv    

            结果是在当前文件夹下生成一个文件夹python3_venv

        3. 2    切换到虚拟环境的scripts中,激活虚拟环境    

            $cd python3_venv/scritps

            $ activate

        3.3     命令行首出现(python3_venv)表示虚拟环境激活了.

        3.4    切换到qihuan_website项目中

            $ cd ../../qihaun_website

4    安装django

    $ pip  install  django

    查看django版本,

        

            #首先进入python环境
            $python
            #导入django
            >>>import django
            #查看django版本
            >>>print(django.get_version())
            2.0.7
            #退出python命令行
            >>> exit()
            

5    创建一个django项目        

    $django-admin   startproject    qihuan_web

    django会自动创建一个文件夹qihuan_web

    $cd qihuan_web

    $python manage.py  runserver 

    用浏览器访问http://127.0.0.1:8000    如果显示页面是有一个大大大的火箭,django欢迎页面说明项目创建成功.

6    打开mysql数据库,创建一个qihuan_db的数据库,来存储数据.(关于数据库的安装请自定百度)

    $ mysql -u  mysql -p mysql

    mysql>create database qihuan_db    charset='utf8';

    #退出mysql

    mysql>exit

7    创建应用blog,实现博客功能的模块:ctrl+c结束刚才的运行的服务器

    $ python  manage.py  startapp  blog

    会在当前文件夹下创建一个blog文件夹

    打开当前文件夹下qihuan_web下的settings.py进行设置

    

    #文件:./qihuan_web/settings.py
    
    -------------安装应用程序---------------------
    INSTALLED_APPS = [
        'blog.apps.BlogConfig',
    
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        
    ]
    ----------------配置数据库--------------------------
    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'ENGINE':'django.db.backends.mysql',#数据库引擎
            'NAME':'qihuan_db',#数据库名称
            'USER':'root',#用户
            'PASSWORD':'mysql',#密码
            'HOST':'',#连接主机地址,本地
            'PORT':'',#端口,默认
        }
    }
    ----------------设置时区,中国时间------------------
    USE_TZ = False
    TIME_ZONE = 'Asia/Shanghai'
    ---------------设置中文--------------------
    LANGUAGE_CODE = 'zh-Hans'
    
    =================数据库操作需要接口转换==================
    文件:./blog/__init__.py
    
    import pymysql
    pymysql.install_as_MySQLdb()

8    安装pymysql:

    $ pip  install  pymysql

    创建数据库迁移:

    $python manage.py migrate

    启动服务器看是否是中文了是否设置成功,显示中文欢迎页面.

    $python manage.py  runserver

第二章 模型设计

1    需求分析,目前要先做一个奇幻博客系统.

    那么就是要能够发布文章,展示文章,先简单实现个人在django后台发布.

    那么文章就要有一个数据表,有数据表就要有字段,文章的字段标题,摘要,正文,作者,发布时间,修改时间.

    那么就是会创建一个模型,保存指定的数据.

    参考资料:Python必会的单元测试框架 —— unittest  https://blog.csdn.net/huilan_same/article/details/52944782

2    实现模型:

    参考资料:https://www.cnblogs.com/LiCheng-/p/6920900.html

    编写blog/models.py
    from django.db import models
    
    # Create your models here.
    class Post(models.Model):
        # title    :文章标题,可变字符串,不可为空
        title = models.CharField(max_length=50,verbose_name="标题")
        # summary    :文章摘要,可变字符串,不可为空
        summary = models.CharField(max_length=50,verbose_name="摘要")
        # body:文章正文
        body = models.TextField(verbose_name="正文")
        # author    :作者,可变字符串,
        author = models.CharField(max_length=15,verbose_name="作者")
        # create_time:创作时间,日期模型,默认为当前时间,不可为空,,以后不可以改变
        create_time = models.DateTimeField(verbose_name="创作时间",auto_now_add=True)
        # modify_time:最后修改时间,默认为创建时间,以后会改变
        modify_time = models.DateTimeField(verbose_name="修改时间",auto_now=True)
    
        def __str__(self):        
            return self.title
    
        class Meta:
            verbose_name = "文章信息表"
            ordering=["-modify_time","title"]
        
    ----------------------------------------------------------------
    激活模型,创建数据表.
    1    在启动一个cmd窗口,之前的窗口用来测试,不要动,方便使用.这个新的cmd命令行,要先进入虚拟环境,然后切换到项目目录下,也就是E:\Development\qihuan_website\qihuan_website\qihuan_web
    2    创建模型生成更改文件
    $python manage.py makemigrations blog
    结果是在blog/migrations文件夹下面生成一个0001_initial.py,里面的就是下面将要如何创建数据库的代码了,因为后面的根据那个文件来创建数据表.
    查看创建表的sql代码
    $python manage.py sqlmigrate blog 0001
    迁移数据库,创建表
    $python  manage.py  migrate
    结果会稍微缓慢,因为在操作数据库,最后出现一练串 ok,那就好了,
    如果,想要确定,可以去数据库查看.

3 交互测试模型:    

    1 进入交互环境
    $python manage.py shell
    >>>from blog.models import Post    #导入模型
    ------------------------------添加数据---------------------------------------
    >>>Post.objects.all()    #查看所有的数据
    <QuerySet []>
    >>>p1 = Post(title="面向对象四大特征",body="面向对象的定义,作用...",summary="面向对象的抽象,继承,封装,多态",author="玄锷无梦")    #创建对象,create_time,modify_time会自                                                #动生成无需传入
    >>>p1.save()  #保存数据到数据库
    >>>Post.objects.all()
    <QuerySet [Post:面向对象四大特征]>
    >>>p11 = Post.objects.get(title="面向对象四大特征")   #获取数据
    >>>p11    #查看对象
    ...
    >>>p11.title    #查看标题
    >>>p11.create_time  #查看创建时间
    >>>p11.modify_time  #查看创建时间
    >>>p11.body="面向对象是程序开发的基础概念..."   #修改p11数据
    >>>p11.save()   #保存修改
    >>>p11.body  #查看修改后的数据
    ...
    >>>p11.modify_time #查看修改后的修改时间
    ...
    >>>p11.create_time  #查看创建时间
    ...
    '''再增加一行数据,自己添加吧.
        p2 = Post(title="GIL",summary="GIL全局锁,仅仅存在于Cpython编辑器,和python语言没有关系",body="GIL的存在历史原因,解决办法...",author="玄锷无梦")
            p2.save()        
    '''
    >>>p3 = Post.objects.create(title="Linux笔记",summary="这里仅仅收录了常用的linux命令",body="多多使用几次就熟练了...",author="玄锷无梦") #直接创建并保存到数据库
      >>>p4 = Post.objects.create(title="元类",summary="元类就是创建类对象的类",author="玄锷无梦",body="python中一切皆对象....")
      '''  另外一种修改方法,
            p5 = Post(title="感恩新时代")
            p5.summary="进入新时代,应当以历史的角度,看待这一历史巨变"
            p5.body="新时代,新历史,新征程..."
            p5.author="玄锷无梦"
            p5.save()
    '''
    '''get_or_create()方法,表示如果没有就插入新的,有的话就不插入.返回值是一个元祖.
    p6 = Post.objects.get_or_create(title="面向对象四大特征",summary="面向对象的抽象,继承,封装,多态",body="面向对象的思想.....",author="玄锷无梦")
            P7 = Post.objects.get_or_create(title="ORM对象映射数据库",summary="将对象与数据库关联起来,无需直接操作数据库",body="ORM的定义,原因,使用场景.....",author="玄锷无梦")
    '''
    ------------------------修改数据---------------------------------
    '''    
            p1 = Post.objects.get(pk=5)
            p1.title="大力发展科技"
            p1.save()
    '''
    ''' update方法直接修改,立即更新到数据库,返回值是1表示成功,返回值是0表示修改失败.同时modify_time并不会更新.
    p3 = Post.filter(title="元类").update(summary="python元类文章")
    '''
    -------------------查询数据---------------------------
    '''get()方法查询,不存在时会报错,django文档中也有其他查询方法,用的时候再说呗.
            p1 = Post.objects.get(title="感恩新时代")
            p2 = Post.objects.get(title="面向对象")        
            #根据pk查询
            p3 = Post.objects.get(pk=1)        
            #根据summary查询,获取的是一个列表
            p4 = Post.objects.filter(summary__icontains="抽象")    
            #根据body查询
            p5 = Post.objects.filter(body__icontains="新时代")    
            #根据author查询,判断结果是否为True
            p6 = Post.objects.filter(author="玄锷无梦")    #查询作者是玄锷无梦
            P7 = Post.objects.exclude(author="玄锷无梦") #查询作者不是玄锷无梦的文章
    '''
    ----------------------删除数据-----------------------------------
    '''
    p1 = Post.objects.get(pk=5).delete()
    Post.objects.filter(title="GIL").delete()
    '''
    还有很多方法,等到需要的时候再查吧,有兴趣的可以去练练

4 admin管理后台管理数据

    

    1 创建管理员账号
        $python manage.py createsuperuser
        (自己输入要设置账号密码就行啦)
    2 注册模型到admin管理后台
        文件:blog/admin.py
        from django.contrib import admin
        from .models import Post
        # Register your models here.
        class PostAdmin(admin.ModelAdmin):
            pass
    
        admin.site.register(Post,PostAdmin)
    3 启动开发服务器
        $python manage.py runserver
    4 打开浏览器,输入localhost:8000/admin/
        输入密码后,可以界面形式的操作增删改查.

==========================最后考虑,先快速开发==============================

2    编写测试

    2.1  创建测试文件夹:

    

    $mkdir test_programmer
    
    $ cd  test_programmer
    $mkdir blog_test

    2.2    编写测试文章数据的文件:    

        #假设我们的文章模型名字是Post
        #创建测试文件夹
        $cd blog_test
        $touch test_post_model.py
        $touch __init__.py
        
    =============编写这个文件  test_post_model.py======================
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    '''
    这个文件用来测试,blog应用中post模型的功能是否正常.
    假设模型post具有以下属性:
    title    :文章标题,可变字符串,不可为空
    summary    :文章摘要,可变字符串,不可为空
    body:文章正文
    author    :作者,可变字符串,
    create_time:创作时间,日期模型,默认为当前时间,不可为空,,以后不可以改变
    modify_time:最后修改时间,默认为创建时间,以后会改变
    
    '''
    #导入unittest模块
    import unittest
    #测试创建操作数据库的方法,必须导入TestCase
    from  django.test import TestCase
    
    
    
    
    #导入要测试的模型
    from  blog.models import Post
    
    #创建测试类
    class PostTestCase(TestCase):
    
        #测试添加数据
        def test_add_post():
            '''
            如何测试数据是否添加成功,
            那么首先必须创建数据对象,并增加后,如果不报错,那么数据添加成功.
    
            '''
            #创建添加7ge对象,数据库中应当有6条
            p1 = Post(title="面向对象四大特征",body="面向对象的定义,作用...",summary="面向对象的抽象,继承,封装,多态",author="玄锷无梦",create_time="2018-7-3 7:12:38",modify_time="2018-7-3 7:12:38")
            p1.save()
            p2 = Post(title="GIL",summary="GIL全局锁,仅仅存在于Cpython编辑器,和python语言没有关系",body="GIL的存在历史原因,解决办法...",author="玄锷无梦")
            p2.save()
            p3 = Post.objects.create(title="Linux笔记",summary="这里仅仅收录了常用的linux命令",body="多多使用几次就熟练了...",author="玄锷无梦")
            p4 = Post.objects.create(title="元类",summary="元类就是创建类对象的类",author="玄锷无梦",body="python中一切皆对象....")
            p5 = Post(title="感恩新时代")
            p5.summary="进入新时代,应当以历史的角度,看待这一历史巨变"
            p5.body="新时代,新历史,新征程..."
            p5.author="玄锷无梦"
            p5.save()
            p6 = Post.objects.get_or_create(title="面向对象四大特征",summary="面向对象的抽象,继承,封装,多态",body="面向对象的思想.....",author="玄锷无梦")
            P7 = Post.objects.get_or_create(title="ORM对象映射数据库",summary="将对象与数据库关联起来,无需直接操作数据库",body="ORM的定义,原因,使用场景.....",author="玄锷无梦")
            #计算数据库中的数据数量,判断是否正确
            self.assertEqual(Post.objects.all().count(),6)
    
        #测试查询数据
        def test_select_post():
            #根据title查询
            p1 = Post.objects.get(title="感恩新时代")
            p2 = Post.objects.get(title="面向对象")
            self.assertFalse(p2)
            with self.assertRaises(AttributeError):
                Post.objects.get(title="迎娶白富美")
            #根据pk查询
            p3 = Post.objects.get(pk=1)
            self.assertEqual(p3.title,"面向对象四大特征")
            #根据summary查询,获取的是一个列表
            p4 = Post.objects.filter(summary__icontains="抽象")
            self.assertTrue(instance(p4,set))
            #根据body查询
            p5 = Post.objects.filter(body__icontains="新时代")
            self.assertTrue(instance(p5,set))
            #根据author查询,判断结果是否为True
            p6 = Post.objects.filter(author="玄锷无梦")
            self.assertTrue(instance(p6,set))
            #根据author查询
            P7 = Post.objects.exclude(author="玄锷无梦")
            self.assertFalse(p7)
    
    
    
        #测试修改数据
        def test_modify_post():
            '''
            修改指定字段的值,把它取出来,查看是否修改成功.
            '''
            p1 = Post.objects.get(pk=5)
            p1.title="大力发展科技"
            p1.save()
            p2 = Post.objects.get(pk=5)
            self.assertEqual(p2.title,"大力发展科技")
    
            p3 = Post.filter(title="元类").update(summary="python元类文章")
            self.assertEqual(Post.filter(title="元类").summary,"python元类文章")
            #测试删除数据
            
        def test_del_post():
            '''
            这是删除,将几条记录进行删除,查询是否还存在
            '''
            p1 = Post.objects.get(pk=5).delete()
            with assertRaises(Exception):
                Post.objects.get(pk=5)
    
    
    
    
    if __name__ == '__main__':
        #运行测试,unittest会自动实例化所有的类,
        #然后运行类中所有以test开头的方法
        unittest.main()

    2.3    为了让测试的输出更好看,更人性化,下载HTMLTestRunner输出漂亮的HTML报告                下载地址https://pan.baidu.com/s/1dEZQ0pz    (请使用这个文档,因为这个是经过修改,适合python3的)

        创建文件夹

        

            $ cd ..
    
            $ mkdir  test_html_template
    
            $ cd test_html_template
            创建一个__init__.py文件
            将下载的模块放到这里.

        

    2.4 编写主测试文件

        

    切换到test programmer
    $ cd ..
    创建主测试文件test_suite.py
    
    ---------------编写test_suite.py---------------------------
    import unittest
    from test_html_template.HTMLTestRunner import HTMLTestRunner
    from blog_test.test_post_model import PostTestCase
    
    if __name__ == '__main__':
        #创建TestSuite对象
        suite = unittest.TestSuite()
        #添加我们的测试类到suite对象中
        suite.addTests(unittest.TestLoader().loadTestsFromTestCase(PostTestCase))
        #运行测试,输出到测试文档中
        with open('Test_Post_Report.html','w') as f:
            runner = HTMLTestRunner(stream=f,
                                    title='Blog Post Test Tepost',
                                    description='generated by HTMLTestRunner.',
                                    verbosity=2
                                    )
            runner.run(suite)

    2.5 运行主测试文件:

        $ python  test_suite.py
        Traceback (most recent call last):
          File "test.suite.py", line 3, in <module>
        from blog.test_post_model import PostTestCase
          File             "E:\Development\qihuan_website\qihuan_website\qihuan_web\test_programmer\blog\test_post_model.py", line 24, in <module>
        from  blog.models import Post
    ModuleNotFoundError: No module named 'blog.models'
    --------------------------------解决办法添加搜索路径-------------------
    python添加模块搜索路径和包的导入:
    https://blog.csdn.net/weixin_40449300/article/details/79327201
    打开虚拟环境python3_venv/Lib/site-packages文件夹
    创建一个qihuan_web.pth文件写上你要加入的模块文件所在的文件夹路径
    E:\Development\qihuan_website\qihuan_website\qihuan_web
        $ python  test_suite.py
        (出现报错信息,没有post模块)很好,由于测试比较麻烦,就在这里简单了解一下,后面不再测试.

 
 

猜你喜欢

转载自blog.csdn.net/weixin_42040854/article/details/81251865