昨日内容回顾
1.通过浏览器访问
2. web应用的优点:
一个浏览器
节省资源
不用更新
3. 缺点:
严格依赖服务端
浏览器会出现兼容性问题
# python三大主流框架:
Django框架
flask
tornado(异步高性能框架)
# MTV:
M model
T template
v views
# MVC:
M model
V view
C controller
# 版本:
django1.x
django2.x
django3.x
# 安装Django
命令行:pip3 install django==1.1.1
# 创建项目
1.命令行创建
django-admin startproject 项目名
2.pycharm创建
'''django安装成功之后,会生成一个可执行文件,django-admin'''
# 两种方式创建的区别:
1.pycharm创建有templates文件夹
2.配置文件有区别
# 启动django项目
1.命令行
python3 manage.py runserver 127.0.0.1:8000
2.pycharm启动
点击绿色按钮
# 创建应用
1.命令行:
python3 manage.py startapp 应用名
2.pycharm创建
'''应用创建完毕,一定要去配置文件注册应用'''
今日内容概要
- django三板斧
- 静态文件配置
- request请求
- form表单
- pycharm连接MySQL
- Django连接MySQL(重点)
内容详细
1. django三板斧
# 1.HttpResponse
作为返回值 返回给浏览器了
# 在 urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index)
]
"""
# 在 views.py文件中添加:
"""
from django.shortcuts import render,HttpResponse
import time
# Create your views here.
def index(request): # 暂且记忆 index返回值是字符串类型
print(123)
return HttpResponse('HELLO DJANGO') # 返回给浏览器了
"""
# 2.render
# 在 urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index)
]
"""
# 在 views.py文件中添加:
"""
from django.shortcuts import render, HttpResponse
import time
# Create your views here.
def index(request):
print(123)
ctime = time.strftime('%Y-%m-%d %X')
a = 1
b = 2
print(locals())
# return render(request, 'index.html', {'ctime11':ctime, 'a':1, 'b':2}) # 写法一
return render(request, 'index.html', locals()) # 写法二
"""
# 在templates文件夹下创建HTML文件
# HTML文件内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>hello render!</h1>
<h2>当前时间:{{ ctime01 }} </h2>
<h2>当前时间:{{ a }} </h2> <!--大括号包大括号 模板语法-->
<h2>当前时间:{{ b }} </h2> <!--大括号包大括号 模板语法-->
</body>
</html>
"""
{{}} 大括号包大括号 模板语法
{% %} 也是模板语法
"""
# 3.redirect
# 在 urls.py文件中添加:
"""
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index)
]
"""
# 在 views.py文件中添加:
"""
from django.shortcuts import render, HttpResponse, redirect
import time
# Create your views here.
def index(request):
print(123)
ctime = time.strftime('%Y-%m-%d %X')
a = 1
b = 2
print(locals())
# return redirect('http://www.baidu.com') # 返回值自动跳转
return redirect('/admin/') # 自动补充:ip+port/admin
"""
# 在settings.py文件中:
默认配置为:
DEBUG = True # 报错显示在浏览器页面上
ALLOWED_HOSTS = []
如果改为:
DEBUG = False # 报错就不会再显示在浏览器页面了
ALLOWED_HOSTS = ['*']
2. 静态文件配置
# 什么是静态文件
css, js, jq, bootstrap, img...
# 静态文件的存储路径一般是static
默认是没有这个文件夹的,所以需要我们自己手动创建出来这个文件夹
static文件夹是在项目路径下的第一级文件目录
# 在static文件夹中还可以继续根据不同的功能进行划分
js
css # 将CDN导入的CSS文件下载到本地 放置在该目录下
lib
img
# 在settings.py文件中:
"""
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'), # 这样一配置完成,静态路径的根就是static
]
此外还可以配置多个路径:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'static1'),
os.path.join(BASE_DIR, 'static2')
]
查找文件顺序为从上而下 找到为止
"""
# 新建HTML文件内容:{# 动态导入方法(推荐使用) #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{# <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>#}
{# <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
{# <link rel="stylesheet" href="/static/css/bootstrap.min.css"> {# 导入方法更改为本地导入 #}
{# 动态导入方法(推荐使用) #}
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">登录页面</h1>
<form action="">
<p>
<input type="text" name="username" class="form-control">
</p>
<p>
<input type="text" name="password" class="form-control">
</p>
<input type="submit" value="登录" class="btn-block btn-primary">
</form>
</div>
</div>
</body>
</html>
# <form action=""> action参数内容:
1.什么都不写,提交到当前页面
2.全写:https://passport.baidu.com/v2/api/?login
3.只写后缀
/login/ => 浏览器会自动补全ip和端口
http://127.0.0.1:8000/login/
# 请求方式:
get
传参数方式:http://127.0.0.1:8000/login/?a=1&b=2&c=3
post
区别:
get请求:
1. get没有请求体
2. 对数据大小的限制是4KB
3. 不安全
post请求:
1. post才有请求体
2. 对数据大小没有限制
3. 安全
'''
MySQL中可能会出现的安全问题:SQL注入
前端当中可能会出现的安全问题:xss攻击
django中会出现的安全问题:csrf跨站请求
'''
# 在settings.py文件中:
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware', # 在Django学习过程中 只要遇到csrf报错 就要将该行注释掉 最好不要删除
]
# 在 views.py文件中添加:
"""
def login(request):
# 1.判断请求方式
print(request) # <WSGIRequest: GET '/login/'> 结果为:GET请求
print(request.method, type(request.method)) # GET / <class 'str'> method意为:方法
if request.method == 'POST':
# 2.获取post请求方式的数据
print(request.POST) # <QueryDict: {'username': ['Deity-JGX'], 'password': ['123']}>
print(request.POST.get('username')) # Deity-JGX
# get只能拿最后一个值
print(request.POST.get('hobby')) # 4 拿最后一个值
print(request.POST.getlist('hobby')) # ['1', '2', '3', '4'] 拿到所有的值
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'ly' and password == '123':
return HttpResponse('登录成功')
else:
return HttpResponse('密码错误')
return render(request, 'login.html')
"""
# 新建HTML文件内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{# <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>#}
{# <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
{# <link rel="stylesheet" href="/static/css/bootstrap.min.css"> {# 导入方法更改为本地导入 #}
{# 动态导入方法(推荐使用) #}
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">登录页面</h1>
<form action="" method="post">
<p>
<input type="text" name="username" class="form-control">
</p>
<p>
<input type="password" name="password" class="form-control">
</p>
<input type="checkbox" name="hobby" value="1">
<input type="checkbox" name="hobby" value="2">
<input type="checkbox" name="hobby" value="3">
<input type="checkbox" name="hobby" value="4">
<input type="submit" value="登录" class="btn-block btn-primary">
</form>
</div>
</div>
</body>
</html>
4. pycharm连接MySQL
如图操作:
5. django连接mysql
# 先在settings.py文件中修改以下信息:
DATABASES = {
# 'default': { # 注释掉该字典
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default':{ # 添加该字典
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db', # 库名
'HOST': '127.0.0.1',
'POST': 3306,
'USER': 'root',
'PASSWORD': '123',
'CHARSET': 'UTF8'
}
}
# 如果此时直接启动项目 可能会遇到报错
'Did you install mysqlclient or MySQL-python?' % e
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'.
Did you install mysqlclient or MySQL-python?
原因是:
django默认的操作mysql的模块是MySQLdb
'''
在python3.6版本以下,在任一__init__文件中 需要加入下面两句话:
如果你的解释器中没有pymysql模块 那就需要先安装pymysql
pip3 install pymysql
如果有pymysql模块 直接写入下面代码:
import pymysql
pymysql.install_as_MySQLdb()
之后再重新启动项目
'''