Django02 - 入门2

一:django目录介绍

- django001:			项目名
    - app01:			app名字
        migrations:		数据库变更相关记录
        admin.py:		后台管理
        apps.py:		app的相关配置
        models.py:		数据库相关
        tests.py:		测试相关
        views.py:		视图函数

    - django001:		和项目名同名的目录
        settings.py:	配置文件
        urls.py:		总路由
        wsgi.py:		wsgi服务器配置

    - templates:		模板文件(一堆HTML)
    
    - manage.py:		启动项目、创建app、各种命令的操作

二:app介绍

app就是一个独立的功能,一个包

1.创建app

python3 manage.py startapp app名字

2.作用

没有app,完全可以(一般情况下,1个项目,至少有1个app)

多个app的作用:区分不同的功能(例如:淘宝有 用户相关功能、商品相关功能、订单相关功能,可以放在不同app中)

  • 解耦合,把类似的功能写到一起,组成一个app

3.创建第二个app

python3 manage.py startapp 第二个app名字

4.app的注册

方式1:

'app01.apps.App01Config'

方式2:

'app01'

三:django的启动方式

1.方式1 - PyCharm

点击运行

如果不行,就进行如下设置

2.manage.py

python3 manage.py runserver 127.0.0.1:8000

python3 manage.py runserver 8000				# 不指定IP地址,默认就是本地地址 

python3 manage.py runserver 0.0.0.0:8000		# 外部网络亦可访问

3.django的socket

在django中,默认情况下,使用的socket是wsgiref,性能很低,仅用于测试

真正后期上线的时候,需要使用性能更高的web服务器:uwsgi

了解:cgi, fastcgi, wsgi, uWSGI, uwsgi, wsgiref

四:配置文件详解

import os

# BASE_DIR:项目的根路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECRET_KEY:密钥,项目中默认的一些加密 会用到它(可以改,但不能删)
SECRET_KEY = 'ov7178+j+$e4x$_vui@f1)o@ymm963-96^%6zh+spq-yy2ws@*'

# DEBUG:调试模式,开发阶段是True,上线阶段是False。
# 如果设置成True的话,可以看到响应的提示和路径,报错信息更完善。
DEBUG = True

# ALLOWED_HOSTS:上线阶段使用,允许谁访问,*表示全部
ALLOWED_HOSTS = []

# INSTALLED_APPS项目所有的app,是一个列表,新增的app就是在这里注册的
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]

# MIDDLEWARE:中间件
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',
]

# ROOT_URLCONF:根路由的文件地址,位置是可以改变的
ROOT_URLCONF = 'django001.urls'

# TEMPLATES:模板文件存放路径
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]	# 重点看这里,这个路径是一个列表,django-admin创建的django项目,需要手动配置
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# WSGI_APPLICATION:wsgi服务器使用的是哪个
WSGI_APPLICATION = 'django001.wsgi.application'

# DATABASES:数据库连接配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# AUTH_PASSWORD_VALIDATORS:一些模块,内置模块、内置app相关
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# 国际化相关:语言和时区
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

# STATIC_URL:静态文件配置相关
STATIC_URL = '/static/'

重点

1.数据库

2.静态文件相关

3.根路由

4.模板文件

5.是否是调试模式

6.app是否注册

五:路由简单入门

路由:地址 与 视图函数 的映射关系 —— uels.py

# urlpatterns列表:列表内放了url函数的执行结果
# 使用很简单,复制一行,改一下第一个参数(带有正则表达式的路径)和第二个参数(对应的视图函数内存地址)
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 在内部,请求来了,路径匹配成功,内部自动调用index(request),把request传入
    url(r'^index/', view.index),
]

六:视图简单入门

1.视图函数:views.py

可以不放在views.py中,但是通常放在里面

2.请求对象

  • request.method —— get、post

  • request.GET —— 当做字典来用

  • request.POST —— post形式传递的参数

post请求可不可以在请求地址中携带数据?

可以

# request必须传,约定俗称都使用request
# request是一个对象,请求的对象。请求过来的是符合HTTP协议的数据包(字符串)
# django把HTTP请求,拆分、封装到看request对象中
# 拆HTTP:1.字符串拆成字典(wsgiref做的)2.封装到request对象中
# request对象中一定有档次HTTP请求的所有东西:请求地址、请求方式、请求头、请求体
def index(request):
    # 1.请求方式(常用:GET、POST)浏览器地址栏中发出的都是GET请求
    print(request.method)

    # 2.请求的参数:get请求是这种形式:http://127.0.0.1/index?name=Darker&age=18
    print(request.GET)          # 把它当成字典
    # print(request.GET.get('name'))
    print(request.GET['name'])  # 可能会报错,所以推荐用get取值
    # print(request.GET.get('age'))

    # 3.POST形式提交的数据(数据存放在请求体(body体)中)
    print(request.POST)         # 把它当成字典


    return HttpResponse('OK')

3.响应对象

① HttpResponse(一个类):返回字符串形式

return HttpResponse('<h1>Hello World</h1>')

② render(一个函数,返回HttpResponse的对象):返回模板文件

return render(request, 'index.html')

③ redirect(一个函数,返回HttpResponse的对象):重定向

return redirect('/index')
return redirect('http://www.xuexianqi.top')

七:静态文件配置

静态文件:jscssimg

1.去settings.py中配置

# 静态文件配置相关
STATIC_URL = '/static/'

# 再配一个 STATICFILES_DIRS=列表(列表内写路径)
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  # 真实的静态文件路径
)

2.新建一个static文件夹

在该文件夹下,新建:imgcssjs文件夹。

以后,在相应的目录,放相应的代码。

3.在模板的HTML中使用

<script src='/static/jquery.js'></script>

4.静态文件的本质

STATIC_URL = '/static/'其实就是开了一个隐藏的路由

八:简单的登录功能

路由

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^$', views.login),
    url(r'^index/', views.index),
]

视图函数

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 创建数据库连接
        conn = pymysql.connect(
            host='127.0.0.1',
            user='root',
            database='userinfo',
            port=3306
        )
        # 拿到1个游标
        cursor = conn.cursor()
        # 执行sql
        cursor.execute('select * from user where username=%s and password=%s', (username, password))
        # 获取结果
        ret = cursor.fetchone()
        print(ret)
        if ret:
            # return redirect('/index')
            return render(request, 'index.html')
        else:
            return HttpResponse('账号或密码错误!')


def index(request):
    return render(request, 'index.html')

九:MTV与MVC

MVC架构 - 主流的web框架

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,它们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求。

Web应用分为模型(M)、视图(V)、控制器(C)
  • M - Model:数据库相关操作
  • C - Controler:控制器,逻辑相关,逻辑代码
  • V - View:视图,模板文件

MVC结构

MVT架构 - Django的框架

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同

  • M - Model(模型):数据库相关操作,负责业务对象和数据库的关系映射(ORM)
  • T - Template(模板):(就是MVC的V层)负责如何把页面展示给用户(html)
  • V - View(视图):(路由+V=MVC的控制器)负责业务逻辑,并在适当时候调用Model和Template

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示

MVT结构

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户)。

视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

十:django请求生命周期

同步框架的并发量:峰值 - 300

0.近几年Python中的几个框架:Sanic、FastAPI(异步框架)

1.Python中的web服务器都符合wsgi协议

2.web服务器

任何语言都会有一个web服务器,负责把HTTP请求转换成这门语言的变量

Python:wsgiref(性能很低)、uwsgi(C语言写的),200多并发量

Java:Tomcat、jboss(300多并发量)

PHP:php服务器

3.django生命周期

十一:虚拟环境讲解,pycharm配置

虚拟环境详解:http://www.xuexianqi.top/archives/126.html

1.虚拟环境的作用

隔离项目,每个项目有自己依赖的模块和包。不同的模块和包的版本就不会相互影响。

2.PyCharm中配置虚拟环境

十二:ORM概述

1.什么是ORM?

Object Relational Mapping,简称ORM,是对象关系映射(和语言无关)

数据库中的表 - 对应程序的一个类

数据库中的一行数据 - 对用程序中的一个对象

2.Python中常见的ORM框架

Django的ORM框架

sqlachemy ORM框架

3.Java:(扩展),Java中写web框架

ssh框架:spring + structs(有漏洞) + hibernate(ORM框架)
ssm框架:spring + springMVC + mybatis(ORM框架,可以写原生sql)
springboot:sb框架(全家桶),内置了Tomcat
springcould:微服务

4.ORM可以做的事

  • 创建表(但是不能创建数据库,只能手动创建数据库)
  • 增加删除表内字段
  • 增删改查数据

十三:django中orm的使用

1.创建UserInfo表 - 在models.py中写一个类

2.表中有字段(类属性)

第一步:models中书写类

from django.db import models


# 一定要继承
class UserInfo(models.Model):
    # 字段属性==》由后面的对象决定
    # 该字段自增,并且是主键
    id = models.AutoField(primary_key=True)
    # 该字段是varchar类型,长度是32(唯一约束,是否是索引,默认值是什么,是否可以为空)
    name = models.CharField(max_length=32)
    # 密码字段
    password = models.CharField(max_length=64)

第二步:执行数据迁移命令

python3 manage.py makemigrations	# 会在migrations文件夹下创建一条记录
python3 manage.py migrate
posted @ 2020-10-20 10:00  轻描丨淡写  阅读(223)  评论(0编辑  收藏  举报