Python攻城师的成长————Django框架基础

今日学习目标

  • 了解Django基础设置操作


学习内容

  • django小白必会三板斧
  • 静态文件及相关配置
  • request对象方法
  • pycharm链接MySQL
  • django链接MySQL
  • django orm操作

一、django小白必会三板斧

与浏览器打交道的视图函数都应该有返回值 常见的就是下列三个

  • HttpResponse
    主要用于返回字符串类型的数据
def index(request):

    return HttpResponse('hello world')
  • render
    主要用于返回html文件 并且支持模板语法(django自己写的)
def ab_render(request):
    # 视图函数必须要接受一个形参request
    user_dict = {'username':'jason','age':18}
    # 第一种传值方式:更加的精确 节省资源
    # return render(request,'01 ab_render.html',{'data':user_dict,'date':123})
    # 第二种传值方式:当你要传的数据特别多的时候
    """locals会将所在的名称空间中所有的名字全部传递给html页面"""
    return render(request,'01 ab_render.html',locals())
  • redirect
    主要用于重定向 括号内可以写其他网站的全称 也可以自己网站的后缀
def index(request):
    return redirect('https://www.baidu.com')

二、 静态文件及相关配置

  • 引言
    既然已经了解了Django的基础使用,那么接下来就以实际案例引出什么是静态文件以及它的相关配置

我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是我们没有开设接口 那么肯定访问不到

  • 需求
    利用Django框架去编写一个简单的登录界面
  • 1.开设接口返回登录界面
  • 2.登录界面需要使用bootstrap并且还需要自己编写css和js
    编写完成后不会经常被修改的与html页面相关的文件
    此时这些就是
    静态文件
  • 3.页面需要获取前端用户数据并且传递给后端
    form表单
    action参数:控制数据的提交地址
    method参数:控制请求的提交方式
  • 4.访问登录页面
    静态文件全部显示资源不存在
    http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
    因为我们并没有开设静态资源访问的接口
  • 5.开设静态资源的访问接口
    理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
    只要是一个web项目都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件 只需要填写固定的配置即可开设资源接口
  settings.py
  	# 静态文件资源访问接口固定配置
  	STATIC_URL = '/static/' 
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    # html页面路径
    	/static/mycss.css
  • 6.配置文件中的两点疑惑

    1.STATIC_URL = '/static/'  # 作用是什么
    2.STATICFILES_DIRS = []  # 为什么是列表(用来存储多个元素的)
    

    以该地址为例:/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
    /static/是接口前缀 表示具备访问静态文件资源的权限
    具备了权限之后会拿着接口前缀后面的文件路径去列表中每个文件夹中查找
    bootstrap-3.3.7-dist/css/bootstrap.min.css
    找到一个就结束
    比如 static和static1里面都有a.txt 那么只会拿到static中的

  • 7.接口前缀动态绑定
    如果templates中有很多html文件并且都需要引入静态资源
    现在把接口前缀修改了 那么会造成:页面无法加载资源

    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    

补充说明

	css文件、js文件、图片文件、第三方框架文件(bootstrap)
 	上述文件都可以称之为是'静态文件' 
  	在django中静态文件单独开设一个文件夹存储  默认叫static文件夹
    在该文件夹内还可以根据功能的不同继续划分不同的文件
  	css文件夹 js文件 img文件夹 others文件夹

三、 request对象方法(部分)

“”"
提交post请求 默认会报403
前期不需要过多考虑 直接去配置文件中注释一行即可
MIDDLEWARE = [
# ‘django.middleware.csrf.CsrfViewMiddleware’,
]
“”"
前面提到的项目中提到了前后端数据交互,这时就要回顾一下在前端和网络编程学习中提到的两种方式了:

  1. get请求和post请求都会触发同一个视图函数login的运行
    如何针对不同的请求执行不同的代码:
    比如:
    get请求返回一个登录页面
    post请求获取用户数据并校验

  2. 获取当前请求方式

    request.method  	返回的是纯大写的请求方法字符串
    

    补充:由于get请求更加常见 post请求次之 所以还可以按照下列方式简写

if request.method == 'POST':
        return HttpResponse('默默的奋斗才是王道 有了成就才有发言权')
    """默认让视图函数处理get请求"""
    return render(request, 'login.html')
  1. 获取post请求提交的普通数据
  request.POST      结果是一个QueryDict 可以看成字典处理
  request.POST.get('username')
  request.POST.getlist('hobby')
  """
      get方法会拿到值列表中最后一个元素  而不是整个列表
      getlist方法会直接拿到整个值列表  
  """
  1. 如何获取url后面携带的数据
  request.GET      结果是一个QueryDict 可以看成字典处理
  request.GET.get('info')
  request.GET.getlist('cityList')
  """
  特征与上述request.POST一致 使用场景也很多
  """

四、 pycharm链接MySQL

步骤:
1.pycharm右上方侧边 database
2.pycharm左下方边角 database
3.上述两个地方都没有 需要下载插件 或者直接重装一个正常的pycharm
settings
plugins
搜索database下载apple即可

链接数据库
1.选择数据库
2.首次链接需要下载驱动
download driver…
3.测试链接如果不通过 则需要换驱动重新下载使用
Driver:MySQL MySQL for 5.1

详细的操作可以参考图文操作教程

五、 django链接MySQL

  • 补充:
    django默认自带一个sqlite3数据库 但是功能很少 仅用于本地测试
  1. 默认配置
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  1. 修改配置
	DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jp_05',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'jason123',
    }
}
  1. 指定模块
注意:Django1.x默认的还是使用MySQLdb:执行会报:ImportError: No module named ‘MySQLdb’

报错:django migrate django.db.utils.InternalError:,一般是数据库编码不为utf8导致

在项目同名的文件夹内的__init__.py
  或者应用名的文件夹内的__init__.py
  添加一行固定的代码
  	import pymysql
		pymysql.install_as_MySQLdb()

六、 django orm操作

django orm简介

ORM:对象关系映射
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

  • 特点
    能够让不会写SQL的python程序员使用python语法就可以直接操作MySQL
    好处:提升了开发效率…
    坏处:封装了SQL语句 有时候可能效率不高 还需要人为编写SQL调优
  • 概念
	表												类 
  一行行数据					 			 类产生的一个个对象
  数据字段					  			对象的一个个属性

更多了解请前往官方文档

orm基本使用

如果需要使用ORM 需要去应用下的models.py中编写代码

  1. 编写类代码
class Users(models.Model):
    uid = models.AutoField(primary_key=True)  # 等价于uid int primary key auto_increment
    name = models.CharField(max_length=32)  # 等价于name varchar(32)
    pwd = models.IntegerField()  # 等价于pwd int
  1. 执行数据库迁移命令

    python3 manage.py makemigrations  
    # 将models.py文件中的改动记录在(app/migrations/00xx_****.py)上
    python3 manage.py migrate  
    #  将改动翻译成SQL语句,去数据库中执行
    

    首次执行迁移命令 django还会自动创建一些默认需要使用到的表

  2. 表名的特征

    Users								app01_users
    

    由于django支持多个应用 为了区分不同应用下可能会出现相同的表名
    所以自动加上了应用的前缀 因为同一个应用下不可能出现相同的表名(只要你是个正常的程序员都不会犯这样的错误)

  3. 扩展
    1.表的主键可以不写 orm会自动帮你写一个名为id的主键
    2.每次修改了跟数据库相关的python代码 都需要重新执行迁移命令
    针对两个迁移命令 可以采用pycharm提示功能编写
    tools
    run manage.py task

数据操作

创建一个学生表

class Student(models.Model):
    name = models.CharField(max_length=20)
    gender = models.BooleanField(default=True)
    age = models.IntegerField(default=0)
    content = models.TextField(max_length=200)
    email = models.EmailField()

单表基础操作

# 增
models.Student.objects.create(name='学生A', gender=False, age=122, content='学习优异', email='studentA@qq.com')

student_obj = models.Student(name='学生B', gender=True, age=13, content='学习良好', email='studentB@qq.com')
student_obj.save()

# 批量增加数据
student_objs = [models.Student(name='学生', gender=True, age=11, content="学生的描述") for i in range(10)]
models.Student.objects.bulk_create(student_objs)


# 删
models.Student.objects.get(id=1).delete()

# 改
obj = models.Student.objects.get(name='学生A')
obj.name = '学生AAA'
obj.save()

# 查
# all():查询所有结果;QuerySet
student_all = models.Student.objects.all()

# filter(**kwargs):查询条件匹配的对象;QuerySet
student_list = models.Student.objects.filter(name='学生B')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值