Django框架
Flask与Django的区别
Flask中:
request请求的取值:
GET: request.args.get(key)
POST: request.form.get(key)
COOKIES: request.cookies.get(key)
FILES: request.files.get(key)
response响应的值:
author='Echo'
return render_template('xxx.html',author=author)
views
在views包中路由和视图函数是一体的,路由作为一个装饰器来装饰视图函数
蓝图:
bp = Blueprint('user',__name__,url_prefix='/user') #定义蓝图 #url_prefix:路径的前缀
@user_bp.route('/') #使用蓝图对象定义路由,相当于app.route('/')
def index():
return
重定向:
return redirect(url_for('blueprintname.视图函数名'))
template模板中
在template模板中:
{
{url_for('index',a=1,b=2)}}
Django中
request请求的取值:
GET: request.GET.get(key)
POST: request.POST.get(key)
COOKIES: request.COOKIES.get(key)
FILES: request.FILES.get(key)
response响应的值:
1.HttpResponse('响应内容')
2.render(request,'模板xxx.html',{'username':username})
路由urls.py
在django中路由和视图函数是分开的,路由在urls中,视图函数在views中
1.主路由中定义:
urlpatterns = [
path('user/',include('user.urls',namespace='user'))#http://127.0.0.1:8000/user/login/
path('news',include('news.urls',namespace='news'))
]
--------------------------------------------------------------
2.在应用中添加urls.py
app_name = 'user' ------>如果没有app_name,会报错
urlpatterns = [
path('',index,name='index')
path('login/',login,name='login')
]
视图函数views.py
def index():
return
重定向:redirect(reverse('namespace#主路由名字:name#子路由名字'))
模板template中
模板中:
{%url'namespace:name'%}
1.简介
Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
Django是一个开放源代码的Web应用框架,由Python写成。
2.构建虚拟环境
打开电脑黑屏终端,输入命令:mkvirtualenv django1901,构建django的虚拟环境。
在配置好虚拟环境之后,创建一个django项目。
在pycharm的控制台Terminal上,安装: pip install django==2.0
pip install mysqlcline
3.项目结构的搭建
创建一个django项目
项目
|---项目同名文件夹
|----settings.py -----> 配置文件 1. 第一步 database 语言 时区
| ---urls.py -----> 主路由文件
| ---wsgi.py
| -- __init__.py
| ---user
|--migrations文件夹
|-- __init__.py
|--views.py
|--models.py
|--tests.py
|--apps.py
|--admin.py
|--urls.py ----->自己添加
| ---templates ----> 模板文件夹
| ---manage.py
第一步
创建一个django项目之后,会有一个与项目同名的文件夹,在这个文件夹里面有:
settings.py ------->配置文件
urls.py ------->主路由文件
wsgi.py
__init__.py
--------------------------------------------------------------
修改settings.py文件中DATABASES的默认值为:
"""
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'XXX',
'USER':'XXX',
'PASSWORD':'XXX',
'HOST':'39.106.150.87',
'PORT':3306
}
}
"""
--------------------------------------------------------------
修改settings.py文件中语言模式和时区模式为:
"""
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
"""
--------------------------------------------------------------
当使用静态文件时需要在settings.py中配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
--------------------------------------------------------------
在使用pip install startapp 应用名 在项目中添加应用时,需要在配置文件settings.py中的NSTALLED_APPS 列表中手动添加上自己创建的应用名。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', # 启动session功能
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'articles',
-----------------------------------------------------------
第二步
安装应用:
python manage.py startapp 应用名
4.路由
flask框架中:
@app.route('/')
def index():
pass
--------------------------------------------------
django框架中:
urls.py ------>专门设置路由
#导入视图函数
from user.views import login
urlpatterns = [
path('login/',login),--->注意:flask中必须添加前导'/',而在django中无需添加。
path('路由路径',视图函数名)
]
5.视图函数
views.py-------> 视图函数
def index(request):----->参数request在定义函数的时候必须传递
#参数request此时就是一个对象
request.path---->
request.method-->
return HttpResponse('hello world')
------------------------------------------------------------
注:render() ------->同flask中的render_template()
6.request的取值:
flask Django
GET: request.args.get(key) request. GET.get(key)
POST: request.form.get(key) request.post.get(key)
COOKIES: request.cookies.get(key) request.COOKIES.get(key)
FILES: request.files.get(key) request.FILES.get(key)
相同:
request.method
request.path
7.response对象
1.HttpResponse(‘响应内容’)
2.render(request,‘模板xxx.html’)
8.主子路由
步骤:
1.主路由中定义:
urlpatterns = [
path('user/',include('user.urls',namespace='user'))#http://127.0.0.1:8000/user/login/
path('news',include('news.urls',namespace='news'))
]
--------------------------------------------------------------
2.在应用中添加urls.py
app_name = 'user' ------>如果没有app_name,会报错
urlpatterns = [
path('',index,name='index')
path('login/',login,name='login')
]
--------------------------------------------------------------
3.使用
9.反向解析
反向解析:给一个函数名,自动的找到路径
反向解析目的:
1.超级链接,form action=''
2.重定向
---------------------------------------------------------------
flask
模板: {
{
url_for('login',a=1,b=2)}}
重定向:redirect(url_for('blueprintname.视图函数名'))
---------------------------------------------------------------
django
模板: {
%url'namespace:name'%}
代码: reverse('namespace:name')
重定向:redirect(reverse('namespace:name'))
10.csrf中间件
在表单提交的时候需要加上{%csrf_token%}才能通过csrf中间件验证
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="{% url 'user:login' %}" method="post">
{% csrf_token %}
<p><input type="text" name="username" placeholder="输入用户名"></p>
<p><input type="password" name="password" placeholder="输入密码"></p>
<p><input type="submit" value="登录"></p>
</form>
</body>
</html>
11template模板
在views视图函数中:
from django.shortcuts import render
# Create your views here.
def index(request):
data = {
'username': 'echo',
'age': 20,
'height': '183cm',
'articles': ['美女是如何修炼成的?', '焊工五级和程序员双重技能修炼术', '葵花宝典', '一阳指', '六脉神剑'],
'desc': '<h1>我是Echo</h1>'
}
return render(request, 'article/index.html', context=data)
# return render_template('article/index.html',username='',age=20,height='',articles=[])
在template模板中:
{% extends 'base.html' %}
{% block title %}
文章首页
{% endblock %}
{% block content %}
{% autoescape off %}
{
{ username }} --- {
{ age }} -- {
{ height }} --- {
{ gender | default:'男' }}--{
{ desc }}
{% endautoescape %}
文章内容: {
{ articles | last }} ---- {
{ 3.895312 | floatformat:2 }} --- {
{ articles.2 }}
{# 遍历#}
{% for article in articles %}
<div>{
{ article }}</div>
{% empty %}
<div>暂无数据</div>
{% endfor %}
{% if age == 20 %}
年龄等于20岁
{% endif %}
{% ifequal age 20 %}
年龄等于20岁------------22222
{% endifequal %}
<br>
<button id="btn">点我试试</button>
{% endblock %}
{% block myjs %}
<script>
button = document.getElementById('btn')
button.onclick = function () {
alert('笑到你。。。。')
}
</script>
{% endblock %}
模板与flask使用的对比
Tag:
flask Django
autoescape:{%autorscape Flase/True%}{%endautoescape%} | {%autorscape on/off%}{%endautoescape%}
for: {%for…%}…{%else%}…{%endfor%} | {%for…%}…{%empty%}…{%endfor%}
{% loop.index 索引%} | {% forloop.counter%}
csrf: 在flask-wtf中 CSRFProtect(app) | 中间件中默认开启了保护,{% csrf_token %}
if: {% if 条件 %} …{%else%}… {%endif%} | {% if 条件 %} …{%else%}… {%endif%}
不可以使用{%ifequal %} | {% ifequal age 20 %}…{% endifequal %}
url: 无此标签 { { url_for(‘blueprintname.endpoint’,key=value,key=value)}} | {% url ‘namespace:name’ arg1 arg2 %}
模板渲染:
Flask:
return render_template('xxx.html',key=value,key=value,....)
使用: 模板中{
{
key}} ---->获取value值
Django:
return render(request,'xxx.html',context={
key:value,key:value,...})
使用: 模板中: {
{
key}} ---->获取value值
12静态文件的使用
1.在settings文件中
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
2.在模板xxx.html页面应用静态文件:
{%load staticfiles %}
3.在模板template中加载静态:
<img src='{%static 'images/a1.jpg'%}' />
<link ref='styleshoots' src='{%static 'css/mycss'%}'>
<script ref='styleshoots' src='{%static 'js/myjs'%}'>
13.model 模型
"""
1. 定义model,自定义一个类继承models.Model
2. 添加类属性
3. 迁移 同步:
python manage.py makemigrations ----> 迁移 产生一个0001.initial.py
python manage.py migrate ----> 同步 构成数据库的映射
注意:如果不明确声明表名: 自动生成的表名就是: appName_model名字
"""
-----------------------------------------------------------
class User(models.Model): # 模型类
username = models.CharField(max_length=12, unique=True)
password = models.CharField(max_length=256)
add_time = models.DateTimeField(default=datetime.now)
isdelte = models.BooleanField(default=False)
def __str__(self):
return self.username
class Meta:
db_table = 'user'
添加
添加:
方式1:
user = User()
# user.username = 'lily'
# user.password = '123456'
# user.age = 18
# user.gender = 'girl'
# user.save()
方式2:
# User.objects.create(username='lucy',password='13kjhfjd',age=20,gender='girl')
删除
删除:
flask : db.session.delete(user对象) db.session.commit()
Django:
单个对象的删除
user = User.objects.filter(username='lily').first()
user.delete()
多个对象 的删除:
User.objects.filter(age__gt=18).delete()
更新
更新:
批量更新:
User.objects.filter(isdelte=False).update(aa='123',age=22)
单个用户:
user = User.objects.get(pk=6)
user.age = 18
user.save()
查询
查询:
Flask:
User.query.all()
User.query.filter(User.uname==zhi)
User.query.get(id)
------------------