web框架之Django

web框架之Django

Django的优点和缺点

优点:大而全自带的功能特别特别多 类似于航空母舰

缺点:有时候过于笨重

命令行使用

1.创建django项目

django-admin startproject mysite

2.启动django项目

python manage.py runserver

3.创建应用app

python manage.py stratapp app01

注意

1.新创建的app需要你去settings配置文件中注册
pycharm只会帮你注册第一个你在创建项目的时候写的应用

注意

  1. 使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
  2. settings文件中 需要你手动在TEMPLATES写配置
    os.path.join(BASE_DIR, 'templates')

小白必会三板斧

from django.shortcuts import render,HttpResponse,redirect

HttpResponse #返回字符串

render #返回HTML页面

redirect #重定向

静态文件配置

静态文件

  1. 网站所用到的
    1. 自己写好的js
    2. 自己写好的css
    3. 第三方的框架 bootstrap fontwesome sweetalert

通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下
STATIC_URL = '/static/' # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""
手动配置静态文件访问资源

STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
  ]
接口前缀 动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

form表单

form表单 action参数可以写的形式
    1.不写 默认朝当前地址提交
    2.只写后缀/index/
    3.写全路径
       
form表单默认朝后端提交的方式 默认是get请求
get请求携带参数的方式 是在url后面?
 url?username=admin&password=213213213213213
 缺点
 1.不安全
 2.get请求携带的参数有大小限制(最大不能超过4KB左右)
    
前期你如果要提交post请求 你就去settings.py文件注释掉一个中间件
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对象及方法

前后端数据交互

获取post请求携带的数据

request.POST

获取get请求携带的数据

request.GET

get和post在后端获取用户数据的时候规律是一样的

<QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
tank <class 'str'>
123 <class 'str'>

注意:

request.POST.get('username')默认只取最后一个元素

如果想将列表完整取出必须用getlist()

Django链接数据库

django连接MySQL

1.配置文件中配置

DATABASES = {
	default': {
    'ENGINE': 'django.db.backends.mysql',  #数据库 MySQL postgreSQL
    'NAME': 'day56',  # 到底使用哪个库
    'USER':'root',
    'PASSWORD':'root',
    'HOST':'127.0.0.1', 
    'PORT':3306,
    'CHARSET':'utf8'
                    }
                }

注意:

django默认使用的是mysqldb连接数据库 但是该模块不支持了
所以你要告诉django不要用mysqldb该用pymysql连接

你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
import pymysql
 pymysql.install_as_MySQLdb()

django orm简介

orm对象关系映射

类                   数据库的表

对象                  表的记录

对象获取属性          记录的某个字段对应的值

优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库

缺点:由于封装程度太高 可能会导致程序的执行效率偏低
有时候 结合项目需求 可能需要你手写sql语句

注意事项:

1.django的orm不会自动帮你创建库,库需要你自己手动创建
表会自动帮你创建 你只需要书写符合django orm语法的代码即可

去应用下所在的models.py中书写类:

from django.db import models

# Create your models here.
class Userinfo(models.Model):
    # 设置id字段为userinfo表的主键  id int primary key auto_increment
    id = models.AutoField(primary_key=True)  # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
    # 设置username字段  username varchar(64)  CharField必须要指定max_length参数
    username = models.CharField(max_length=64)  # 在django orm中 没有char字段  但是django 暴露给用户 可以自定义char字段
    # 设置password字段  password int
    password = models.IntegerField()

数据库迁移(同步)命令

python manage.py makemigrations  # 不会创建表 仅仅是生成一个记录  将你当前的操作记录到一个小本本上(migrations文件夹)

python manage.py migrate  # 将你的orm语句真正的迁移到(同步)到数据库中

只要你在models.py中修改了跟数据库相关的代码  你就必须重新开始执行上面两条命令

数据的增删改查

1.查

def edit_user(request):
    edit_id = request.GET.get('edit_id')
    edit_obj = 	models.User.objects.filter(pk=edit_id).first()
    return render(request, 'edit_user.html', 						locals())

2.增

def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.create(username=username, password=password)
    return render(request, 'register.html', locals())

3.改

models.User.objects.filter(pk=edit_id).update(username=username, password=password)

4.删

models.User.objects.filter(pk=edit_id).delete()

路由层

无名分组和有名分组

无名分组

 url(r'^index/(d+)/',views.index)
在调用视图函数index的时候 会将d+匹配到的内容 当做位置参数传递给index

有名函数

url(r'^index/(?P<year>d+)/',views.index)
在调用视图函数index的时候 会将d+匹配到的内容 当做关键字参数(year='')传递给index

注意

无名有名不能混合使用 但是可以单独使用 单独使用的时候支持多个

反向解析

本质:根据某一个东西得出一个结果 该结果可以直接访问到对应的url

没有正则表达式的反向解析

url(r'^index/',views.index,name='xxx')
# 起别名 别名一定不要重复
前端反向解析
{% url 'xxx' %}
后端反向解析
from django.shortcuts import reverse
	url = reverse('xxx')

无名分组和有名分组反向解析

无名
url(r'^index/(d+)/',views.index,name='xxx')
前端反向解析
{% url 'xxx' 123 %}
后端反向解析
from django.shortcuts import reverse
url = reverse('xxx',args=(123,))
"""个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号"""

有名
url(r'^index/(P<year>d+)/',views.index,name='xxx')
前端反向解析
{% url 'xxx' 123 %}
{% url 'xxx' year=123 %}  # 了解
后端反向解析
from django.shortcuts import reverse
   url = reverse('xxx',args=(123,))
   url = reverse('xxx',kwargs={'year':123})  # 了解
"""个人建议:在处理容器类型数据的时候 无论有几个值 你最后都加一个逗号"""

路由分发

django中的每一个app都可以有自己独立的static文件夹,templates文件夹,urls.py等
正是由于上述的特点 你基于django开发项目 就真正可以做到分组分功能分模块独立的去开发

当应用特别多的时候 总路由中的代码过于冗长 不好维护

1.在应用下自己手动创建urls.py
2.在路由中导入
#1:
from app01 import urls as app01_urls
from app02 import urls as app02_urls

url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))

#2
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls')) 

名称空间

url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02')) 
# app01 urls.py
url(r'^index/',views.index,name='index')
 # app02 urls.py
url(r'^index/',views.index,name='index')
url = reverse('app01:index')
            url = reverse('app02:index')
            {% url 'app01:index' %}
            {% url 'app02:index' %}
# app01 urls.py
url(r'^index/',views.index,name='app01_index')
# app02 urls.py
url(r'^index/',views.index,name='app02_index')

伪静态

url看起来像是一个静态页面(.html结尾)

虚拟环境

不同的项目应该有各自独立的解释器环境 最大化节省资源
实际功能中针对不同的项目 会有一个叫requestsments.txt文件
该文件中列出来是一个个该项目需要用的到模块名和版本号
eg:
django = 1.11.11
nginx = 1.21
后期通过命令直接会去下载该文件内所有的模块及对应版本

虚拟环境 就类似于是个python解释器环境 每创建一个就类似于重新下载了一个纯净的python解释器环境
建议 你的机器上不要有态多的虚拟环境
当前我们这个阶段 建议你所有的模块全部都安装在本机环境中

django版本区别

url和path
path第一个参数不支持正则 写什么就匹配什么 精准匹配
re_path跟url是一模一样的用法

原文地址:https://www.cnblogs.com/zhangmingyong/p/11716686.html