Django基础(一)

一、简介

1、为什么要使用框架来开发?

  • 站在巨人肩膀上
  • 提升开发效率
  • 只关注业务逻辑实现,不关心底层建设

2、Django vs flask

 

 

  •  Django
  1. 大而全
  2. 入门简单
  3. 开发效率高
  4. 最流行
  5. 类似于精装修的房子
  • Flask
  1. 轻量级
  2. 定制化程度高
  3. 流行
  4. 高手的玩偶
  5. 类似于毛坯房

3、Django是什么?

Django makes it eaier to build better Web apps more quickly and with less code.

  • 劳伦斯出版集团为了开发以新闻内容为主的网站而开发出来的这个框架
  • 名字来源于比利时的爵士音乐家DjangoReinhardt

4、特点

  • 提供创建项目工程自动化工具
  • 数据库ORM支持
  • 模板
  • 表单
  • Admin管理站点
  • 文件管理
  • 文件管理
  • 认证权限
  • session机制
  • 缓存

二、创建工程

1、创建虚拟环境

  • virtualenv
  • virtualenvwrapper
  • python -m venv

2、安装Django

  • 进入虚拟环境中
  • pip install Django

3、创建项目

终端命令创建:django-admin startproject 项目名

pycharm工具创建:

 

 

 

4、运行项目

  • python manage.py runserver
  • 或者python manage.py runserver ip:端口

5、项目结构

mysite/   项目根目录

manage.py    以多种方式与Django项目交互的命令行工具

mysite/        以项目根目录同名,项目相关的包

mysite/settings.py   项目全局配置文件

mysite/urls.py        声明全局路由

mysite/wsgi.py      兼容WSGI协议的web服务器入口文件

 

 

 

6、修改默认时区

setting.py对应设置修改成:

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

三、创建子应用

1、定义

  • 如果有一些业务功能模块如何做到复用?
  • 将工程项目拆分为不同的子功能模块
    • 以子应用的形式存在
  • 各功能模块之间可以保持相对的独立
  • 可以将该模块代码整体复制过去

2、创建

  • python manage.py startapp 子应用名
  • python manage.py startapp projects
  • 也可以使用pycharm工具:Tools/Run manage.py Task...

 

 

 

 

 

3、注册

在全局配置文件setting.py中的INSTALLED_APPS列表中添加子应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'projects.apps.ProjectsConfig'
]

子应用名.apps.子应用名(首字母大写)Config

4、创建视图

在projects/view.py文件中添加如下代码:

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def index(request):
  """
  函数视图
  :param request:request是HttpRequest对象,包含前端用户的所有请求信息
  :return:必须返回HttpResponse对象或者一个子对象
  """
  """index视图"""
  return HttpResponse("<h1>Hello, Python测试开发大佬们!</h1>")

 

5、添加路由

  • 方式一:在全局路由mySite/urls.py文件中添加子路由信息:mySite/urls.py
from django.contrib import admin
from django.urls import path
from projects.views import index
urlpatterns = [ path('admin/', admin.site.urls), path('index/', index) ]

刷新页面,初始django页面消失:

 

页面path中显示两个路由,在页面地址加上刚才创建的路由。效果如下:

 

 

 

 

  • 方式二:可以在每个子应用下维护一份路由文件
  1. 创建projects/urls.py子路由文件
from django.urls import path
# from projects.views import index
from .views import index
urlpatterns = [
path(
'', index) ]

     2.在全局路由下设置子路由:

from django.contrib import admin
from django.urls import path, include
from projects.views import index
#全局路由配置
#1.urlpatterns为固定名称列表
#2.列表中的一个元素就代表一条路由
#3.从上到下进行匹配,如果能匹配上,那么Django会导入和调用path函数第二个参数指定的视图或者去子路由中去匹配,
#4.如果匹配不上会自动抛出404错误
urlpatterns = [ path('admin/', admin.site.urls), # path('index/', index) path('index/', include('projects.urls')) ]

效果图如上

如果主路由和子路由改成以下方式:

主路由:

from django.contrib import admin
from django.urls import path, include
from projects.views import index

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('index/', index)
    # path('index/', include('projects.urls'))
    path('projects/', include('projects.urls'))
]

子路由:

from django.urls import path
# from projects.views import index
from .views import index
urlpatterns = [
    # path('', index),
    path('index/', index),
]

效果图:

 

 

 将projects路径加上:

 

 

 再将index路径拼接上:

 

 

 

 

6、子应用结构

  • migrations    用于存放数据迁移历史记录的目录
  • admin.py      跟网站的后台管理配置站点配置相关文件
  • apps.py       用于配置当前子应用的相关信息
  • models.py    保存数据库模型类
  • tests.py       用于编写单元测试类
  • views.py      用于编写web应用视图    
  • 视图
  1. 函数视图

注意:使用postman发送post请求时,会报错,需要将主配置文件的中间件代码注释:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

不同的发送请求方法,都是同样的响应,如果想要不同的发送方法得到不同的响应,在request中有method来判断请求方法。

def index(request):
  """
  函数视图
  :param request:request是HttpRequest对象,包含前端用户的所有请求信息
  :return:必须返回HttpResponse对象或者一个子对象
  """
  """index视图"""
  if request.method == 'GET':
    return HttpResponse("GET请求:<h1>Hello, Python测试开发大佬们!</h1>")
  elif request.method == 'POST':
    return HttpResponse("POST请求:<h1>Hello, Python测试开发大佬们!</h1>")
  else:
    return HttpResponse("其他请求:<h1>Hello, Python测试开发大佬们!</h1>")

 

 

 

 

 

 

 

 

 函数视图代码过多不好维护,在以后的场景中都是使用类视图。

  2.类视图

子应用中定义类视图

from django.views import View
#类视图
class IndexView(View):
  """index 主页类视图"""
  
  def get(self, requset):
    #get请求
    return HttpResponse("GET请求:<h1>Hello, Python测试开发大佬们!</h1>")
  
  def post(self, request):
    return HttpResponse("POST请求:<h1>Hello, Python测试开发大佬们!</h1>")
  
  
  def delete(self, request):
    return HttpResponse("delete请求:<h1>Hello, Python测试开发大佬们!</h1>")

子路由定义:

from django.urls import path
# from projects.views import index
# from .views import index
from projects import views
#1.每一个模块都会维护一个子路由(当前路由信息)
#2.跟主路由一样,从上到下进行匹配
#3.能匹配上则执行path第二个参数指定的视图,匹配不上则返回404
urlpatterns = [
    # path('', index),
    # path('index/', index),
    # 如果为类视图,path的第二个参数为类视图名.as_view()
    path('', views.IndexView.as_view())
]

子路由中已经定义了类视图path,在主路由中就不需要重新定义,get请求结果:

 7、数据读取并插入到模板中

新建index.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div>
        <table class="project" style="margin: auto auto">
            <tr>
                <th>序号</th>
                <th>项目名称</th>
                <th>负责人</th>
                <th>应用名称</th>
            </tr>
            {% for project in datas %}
                <tr>
                    <th scope="row" style="">{{ forloop.counter }}</th>
                        <td>{{ project.project_name }}</td>
                        <td>{{ project.leader }}</td>
                        <td>{{ project.app_name }}</td>
                </tr>
            {% endfor %}
        </table>
    </div>
</body>
</html>

projects/view.py视图中,get请求查询数据并插入到模板中

#类视图
class IndexView(View):
  """index 主页类视图"""
  
  def get(self, requset):
    #get请求
    # return HttpResponse("GET请求:<h1>Hello, Python测试开发大佬们!</h1>")
    #从数据库中读取数据
    datas = [
      {
        'project_name': '前程贷项目',
        'leader': '可优',
        'app_name': 'p2p应用平台'
      },
      {
        'project_name': '探索火星项目',
        'leader': '优优',
        'app_name': '吊炸天应用'
      },
      {
        'project_name': '无比牛逼的项目',
        'leader': '可可',
        'app_name': '神秘应用'
      },

    ]
    return render(requset, 'index.html', locals())

效果图:

 

posted @ 2019-10-08 17:33  sinder2018  阅读(35)  评论(0)    收藏  举报