• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MC_Hotdog
Yeah, you're right I'm still riding that crappy bike
博客园    首页    新随笔    联系   管理    订阅  订阅

基本配置+路由系统+模板

引述

  Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename

  • IDE创建Django程序时,本质上都是自动执行上述命令  

  其他常用命令:

  python manage.py runserver127.0.0.1:8000
  python manage.py startapp appname
  python manage.py syncdb
  python manage.py makemigrations
  python manage.py migrate  

  python manage.py createsuperuser

二、程序目录

 三、配置文件

 1.数据库

 1 DATABASES = {
 2     'default': {
 3     'ENGINE': 'django.db.backends.mysql',
 4     'NAME':'dbname',
 5     'USER': 'root',
 6     'PASSWORD': 'xxx',
 7     'HOST': '',
 8     'PORT': ,
 9     }
10 }
1 # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
2   
3 # 如下设置放置的与project同名的配置的 __init__.py文件中
4   
5 import pymysql
6 pymysql.install_as_MySQLdb()

2.模板

1 TEMPLATE_DIRS = (
2         os.path.join(BASE_DIR,'templates'),
3     )

3.静态文件

https://www.cnblogs.com/open-yang/p/11221829.html

1 STATICFILES_DIRS = (
2         os.path.join(BASE_DIR,'static'),
3     )

路由系统

基本操作:普通url+带正则url(传参数)+路由分发+反生成url

 1 """directory_structure URL Configuration
 2 
 3 The `urlpatterns` list routes URLs to views. For more information please see:
 4     https://docs.djangoproject.com/en/2.1/topics/http/urls/
 5 Examples:
 6 Function views
 7     1. Add an import:  from my_app import views
 8     2. Add a URL to urlpatterns:  path('', views.home, name='home')
 9 Class-based views
10     1. Add an import:  from other_app.views import Home
11     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
12 Including another URLconf
13     1. Import the include() function: from django.urls import include, path
14     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
15 """
16 from django.contrib import admin
17 from django.urls import path, re_path, include
18 from app01 import views
19 
20 
21 urlpatterns = [
22     path('admin/', admin.site.urls),
23     path('app01/', include('app01.urls')),
24     # path('login/', views.login, name='m1'),  # 在前端页面使用反生成url
25 
26     # re_path('edit1/(\w+)', views.edit1, name='m2'),  \
27     # 动态url 在前端页面使用反生成url 有几个参数就在前端页面后边添加参数就是了 {% url 'm2' i %}
28 
29     # re_path('index/(?P<a1>\d+)/', views.index, name='n1'),  根据别名反生成url在后台的使用
30 
31     # path('', views.index),
32     # path('app01/', include('app01.urls')),
33     # path('app02/', include('app02.urls')),
34 
35 ]
总urls.py
 1 from django.urls import path, re_path
 2 from app01 import views
 3 
 4 urlpatterns = [
 5     # re_path('index$', views.index),
 6 
 7     # path('index/', views.index),  # 静态url 一一对应
 8     # re_path('edit/(\w+)', views.edit),  # 动态url  可以变传参
 9     # re_path('edit/(\d+).html$', views.edit), # 伪静态 对权重好点
10     # re_path('edit/(?P<a1>\w+)/(?P<a2>\w+)/', views.edit),
11     # re_path('edit/(\w+)/(?P<a2>\w+)/', views.edit),  # 报错
12 
13     # 对数据库简单操作
14     path('newindex/', views.newindex)
15 ]
app01 urls.py
 1 from django.shortcuts import render, HttpResponse, reverse
 2 
 3 # def index(request, a1):
 4 #     user_list = [
 5 #         'aaa', 'bbb', 'ccc'
 6 #     ]
 7 #     # v = reverse('n1')
 8 #     # v = reverse('n1', args=(1,))
 9 #     v = reverse('n1', kwargs={"a1": 1111})
10 #     print(v)
11 #     return render(request, 'index.html', {'user_list': user_list})
12 #
13 #
14 # def edit(request, a1, a2):
15 #     """
16 #     def edit(request, *args, **kwargs):
17 #     注意这里改成可边长参数 *args **kwargs要报错  url中要统一都要把参数带上
18 #     :param request:
19 #     :param a1:
20 #     :param a2:
21 #     :return:
22 #     """
23 #     print(a1, a2)
24 #     return HttpResponse('.....')
25 #
26 #
27 # def edit1(request, a1):
28 #     return HttpResponse('.....')
29 #
30 #
31 # def login(request):
32 #     return render(request, 'login.html')
33 
34 
35 #  ################# 对数据库操作 #########################
36 
37 from app01 import models
38 
39 
40 def newindex(request):
41     """
42     单表操作UserGroup
43     :param request:
44     :return:
45     """
46     # 新增
47     # models.UserGroup.objects.create(title="销售部")
48     # models.UserInfo.objects.create(username='孙大圣', password='pwd', age=18, ug_id=1)
49 
50     # 查找
51     # group_list = models.UserGroup.objects.all()  # group_list是QuerySet类型  相当于一个列表
52     # for row in group_list:
53     #     print(row.id, row.title)
54 
55     # group_list = models.UserGroup.objects.filter(id=1)
56     # group_list = models.UserGroup.objects.filter(id__gt=1)#大于
57     # group_list = models.UserGroup.objects.filter(id__lt=1) #小于
58 
59     # 删除
60     # models.UserGroup.objects.filter(id=2).delete()
61 
62     # 更新
63     # models.UserGroup.objects.filter(id=2).update(title='公关部')
64     # return render(request, 'newindex.html', {'group_list': group_list})
65     return HttpResponse('......')
app01 views.py
 1 from django.db import models
 2 
 3 
 4 class UserGroup(models.Model):
 5     title = models.CharField(max_length=32)
 6 
 7 
 8 class UserInfo(models.Model):
 9     username = models.CharField(max_length=32)
10     password = models.CharField(max_length=64)
11     # age = models.IntegerField(null=True)
12     age = models.IntegerField(default=1)  # 处理这种问题直接可以设置成空或者默认给个值 因为此时在数据库有数据
13     ug = models.ForeignKey("UserGroup", on_delete=models.CASCADE, null=True)
app01 models.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <ul>
 9         {% for i in user_list %}
10 {#            <li>{{ i }}| <a href="/edit/?nid={{ i }}">编辑</a></li>  SEO权重比较低/get传参经常变动#}
11 {#            <li>{{ i }}| <a href="/edit/{{ i }}/">编辑</a></li>#}
12             <li>{{ i }}| <a href="{% url 'm2' i %}">编辑</a></li>
13         {% endfor %}
14     </ul>
15 </body>
16 </html>
index.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <form action="{% url 'm1' %}" method="post">
 9     <input type="text">
10 </form>
11 </body>
12 </html>
login.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <ul>
 9     {% for row in group_list %}
10         <li>{{ row.id }} ==  {{ row.title }}</li>
11     {% endfor %}
12 
13 </ul>
14 </body>
15 </html>
newindex.html
 1 from django.urls import path, re_path
 2 from app02 import views
 3 
 4 urlpatterns = [
 5     path('index/', views.index),
 6 
 7 
 8     # path('index/', views.index),  # 静态url 一一对应
 9     # re_path('edit/(\w+)', views.edit),  # 动态url  可以变传参
10     # re_path('edit/(\d+).html$', views.edit), # 伪静态 对权重好点
11     # re_path('edit/(?P<a1>\w+)/(?P<a2>\w+)/', views.edit),
12     # re_path('edit/(\w+)/(?P<a2>\w+)/', views.edit),  # 报错
13 ]
app02 urls.py
1 from django.shortcuts import render, HttpResponse
2 
3 
4 def index(request):
5     return HttpResponse('.......')
app02 views.py

模板基本操作

 1 """mysite URL Configuration
 2 
 3 The `urlpatterns` list routes URLs to views. For more information please see:
 4     https://docs.djangoproject.com/en/2.1/topics/http/urls/
 5 Examples:
 6 Function views
 7     1. Add an import:  from my_app import views
 8     2. Add a URL to urlpatterns:  path('', views.home, name='home')
 9 Class-based views
10     1. Add an import:  from other_app.views import Home
11     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
12 Including another URLconf
13     1. Import the include() function: from django.urls import include, path
14     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
15 """
16 from django.contrib import admin
17 from django.urls import path
18 from django.shortcuts import HttpResponse, render, redirect
19 
20 
21 def login(request):
22     """
23     处理请求逻辑
24     :param request:用户请求相关所有信息并返回内容
25     :return:
26     """
27     # 自动找到模板下的login.html看配置文件template
28     # return HttpResponse('login')
29     if request.method == 'GET':
30         return render(request, 'login.html')
31     else:
32         u = request.POST.get('username')
33         p = request.POST.get('password')
34         if u == 'root' and p == '123':
35             return redirect('/index/')
36         else:
37             return render(request, 'login.html', context={'msg': '用户名登录失败'})
38 
39 
40 def index(request):
41     return render(request,
42                   'index.html',
43                   {
44                       'msg': 123,
45                       'user_list': ['励志', '理发'],
46                       'user_dict': {'k1': 'v1', 'k2': 'v2'},
47                       'user_list_dict': [
48                           {'id': 1, 'name': 'eric1', 'email': 'eric13690@163.com'},
49                           {'id': 2, 'name': 'eric2', 'email': 'eric23690@163.com'},
50                           {'id': 3, 'name': 'eric3', 'email': 'eric33690@163.com'},
51                       ]
52                   }
53                   )
54 
55 
56 urlpatterns = [
57     path('admin/', admin.site.urls),
58     path('login/', login),
59     path('index/', index),
60 ]
61 # 路由系统
urls.py
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <link rel="stylesheet" href="/static/commons.css">
 7 </head>
 8 <body>
 9     <h1>用户登录</h1>
10     <form action="/login/" method="post">
11         {% csrf_token %}
12         <input type="text" name="username">
13         <input type="password" name="password">
14         <input type="submit" value="登录">
15         {{ msg }}
16     </form>
17 
18 </body>
19 </html>
login.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <h3>模板简单使用</h3>
 9     {{ msg }}
10     <p>{{ user_list.0 }}</p>
11     <p>{{ user_list.1 }}</p>
12     <p>{{ user_dict.k1 }}</p>
13     <p>{{ user_dict.k2 }}</p>
14     {% for user in user_list %}
15         <h4>{{ user }}</h4>
16     {% endfor %}
17     {% for user in user_list %}
18         <li>{{ user }}</li>
19     {% endfor %}
20     <ul>
21         {% for user in user_list %}
22         <li>{{ user }}</li>
23     {% endfor %}
24     </ul>
25     <table border="1">
26         {% for row in user_list_dict %}
27             <tr>
28                 <td>{{ row.id }}</td>
29                 <td>{{ row.name }}</td>
30                 <td>{{ row.email }}</td>
31                 <td><a href="">编辑</a>|<a href="/del/?nid={{ row.id }}">删除</a></td>
32             </tr>
33         {% endfor %}
34     </table>
35 
36 </body>
37 </html>
index.html

总结:

1、单一路由对应

1 url(r'^index$', views.index),

2、基于正则的路由

1 url(r'^index/(\d*)', views.index),
2 url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), 

3、添加额外的参数

1 url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

4、为路由映射设置名称

1 url(r'^home', views.home, name='h1'),
2 url(r'^index/(\d*)', views.index, name='h2'), 

设置名称之后,可以在不同的地方调用,如:

  • 模板中使用生成URL     {% url 'h2' 2012 %}
  • 函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
  • Model中使用获取URL  自定义get_absolute_url() 方法
 1 class NewType(models.Model):
 2     caption = models.CharField(max_length=16)
 3 
 4 
 5     def get_absolute_url(self):
 6         """
 7         为每个对象生成一个URL
 8         应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
 9         :return:
10         """
11         # return '/%s/%s' % (self._meta.db_table, self.id)
12         # 或
13         from django.urls import reverse
14         return reverse('NewType.Detail', kwargs={'nid': self.id})
View Code

获取请求匹配成功的URL信息:request.resolver_match

5、根据app对路由规则进行分类  

1 url(r'^web/',include('web.urls')),

6、命名空间

a. project.urls.py

1 from django.conf.urls import url,include
2  
3 urlpatterns = [
4     url(r'^a/', include('app01.urls', namespace='author-polls')),
5     url(r'^b/', include('app01.urls', namespace='publisher-polls')),
6 ]

b. app01.urls.py

1 from django.conf.urls import url
2 from app01 import views
3  
4 app_name = 'app01'
5 urlpatterns = [
6     url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
7 ]

c. app01.views.py

1 def detail(request, pk):
2     print(request.resolver_match)
3     return HttpResponse(pk)

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse('app01:detail', kwargs={'pk':11})
  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

模板小结:

1.模版语言

 模板中也有自己的语言,该语言可以实现数据展示

{{ item }}

{% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
  forloop.counter
  forloop.first
  forloop.last 

{% if ordered_warranty %}  {% else %} {% endif %}

母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
   {% block title %}{% endblock %}

   母板是拿来给子板继承的,子板只能用一次

帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}

2、自定义simple_tag

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 from django import template
 5 from django.utils.safestring import mark_safe
 6    
 7 register = template.Library()
 8    
 9 @register.simple_tag
10 def my_simple_time(v1,v2,v3):
11     return  v1 + v2 + v3
12    
13 @register.simple_tag
14 def my_input(id,arg):
15     result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
16     return mark_safe(result)

c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

1 {% load xx %}

d、使用simple_tag

1 {% my_simple_time 1 2 3%}
2 {% my_input 'id_username' 'hide'%}

e、在settings中配置当前app,不然django无法找到自定义的simple_tag

1 INSTALLED_APPS = (
2     'django.contrib.admin',
3     'django.contrib.auth',
4     'django.contrib.contenttypes',
5     'django.contrib.sessions',
6     'django.contrib.messages',
7     'django.contrib.staticfiles',
8     'app01',
9 )

3.自定义filter 

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 
 4 from django import template
 5 
 6 register = template.Library()
 7 
 8 
 9 @register.filter
10 def my_upper(value, arg):
11     return value + arg

 

<h4>特别漂亮的组件 补充include模板导入</h4>
<div>
    <input class="title" type="text">
    <input class="content" type="text">
</div>

  

1 def test(request):
2 
3     return render(request, 'test.html', {'msg': 'mchotdog'})
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    {% include 'pub.html' %}
    {{ msg | my_upper:'泽帅'}}
    <p><a>不能多传参数最多两个参数但是支持模板中循环判断语句,但是simple_tag能多传参数但是不支持模板判断循环判断语句</a></p>
    {% include 'pub.html' %}
</body>
</html>

  

 

更多见文档:https://docs.djangoproject.com/en/1.10/ref/templates/language/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-07-27 22:13  MC_Hotdog  阅读(420)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3