Python的Django框架中的表单处理示例,巡风源码阅

作者: 网络编程  发布:2019-11-08

巡风xunfeng----巡风源码阅读与剖析

Python的Django框架中的表单管理示例,pythondjango

创设多个关于书籍、小编、出版社的事例:

from django.db import models

class Publisher(models.Model):
  name = models.CharField(max_length=30)
  address = models.CharField(max_length=50)
  city = models.CharField(max_length=60)
  state_province = models.CharField(max_length=30)
  country = models.CharField(max_length=50)
  website = models.URLField()

class Author(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=40)
  email = models.EmailField()

class Book(models.Model):
  title = models.CharField(max_length=100)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  publication_date = models.DateField()

咱们几眼下来创建三个简短的view函数以便让客户能够因此书名从数据库中寻找书籍。
平时,表单开辟分为多个部分: 前端HTML页面客户接口和后台view函数对所提交数据的管理进程。 第意气风发有的相当的粗略;以后我们来构建个view来彰显叁个搜索表单:

from django.shortcuts import render_to_response

def search_form(request):
  return render_to_response('search_form.html')

本条view函数能够放置Python的查找路线的别的岗位。 为了便于研究,大家将它放在 books/views.py 里。

这个 search_form.html 模板,恐怕看起来是如此的:

<html>
<head>
  <title>Search</title>
</head>
<body>
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>

而 urls.py 中的 U奥迪Q5Lpattern 大概是如此的:

from mysite.books import views

urlpatterns = patterns('',
  # ...
  (r'^search-form/$', views.search_form),
  # ...
)

(注意,我们间接将views模块import进来了,实际不是用临近 from mysite.views import search_form 那样的讲话,因为前端看起来更简明。卡塔 尔(阿拉伯语:قطر‎

于今,如若你运转 runserver 命令,然后访问 特别轻松。

不过,当你通过这么些form提交数据时,你会获得三个Django 404不当。 那么些Form指向的U昂科威L /search/ 还尚未被实现。 让大家抬高第一个视图函数并设置UPAJEROL:

# urls.py

urlpatterns = patterns('',
  # ...
  (r'^search-form/$', views.search_form),
  (r'^search/$', views.search),
  # ...
)

# views.py

def search(request):
  if 'q' in request.GET:
    message = 'You searched for: %r' % request.GET['q']
  else:
    message = 'You submitted an empty form.'
  return HttpResponse(message)

不时先只彰显客户寻觅的字词,以鲜明寻找数据被科学地付诸给了Django,那样你就能知道寻找数据是何许在这里个种类中传送的。 简单来讲:

    在HTML里大家定义了二个变量q。当提交表单时,变量q的值通过GET(method=”get”)附加在UTiguanL /search/上。

    管理/search/(search()卡塔尔的视图通过request.GET来获取q的值。

亟待注意的是在那处肯定地认清q是不是富含在request.GET中。就像是上边request.META小节里边涉及,对于顾客提交过来的多寡,以致是未可厚非的数据,都需求进行过滤。 在这里地若未有开展质量评定,那么顾客提交一个空的表单将迷惑KeyError非凡:

# BAD!
def bad_search(request):
  # The following line will raise KeyError if 'q' hasn't
  # been submitted!
  message = 'You searched for: %r' % request.GET['q']
  return HttpResponse(message)

询问字符串参数

因为运用GET方法的数据是经过询问字符串的不二法门传递的(比如/search/?q=django卡塔尔,所以大家能够运用requet.GET来获取这么些数据。大家领略在视图里能够使用request.GET来获得守旧URAV4L里的询问字符串(举个例子hours=3卡塔尔。

获得使用POST方法的数码与GET的肖似,只是利用request.POST替代了request.GET。那么,POST与GET之间有什么样差别?当大家付出表单仅仅必要获取数据时就足以用GET; 而当大家提交表单时索要转移服务器数据的景色,也许说发送e-mail,恐怕此外不独有是拿到并出示数据的时候就选取POST。 在此个寻找书籍的例证里,大家使用GET,因为这么些查询不会变动服务器数据的状态。 (如若您有意思味精晓更多关于GET和POST的学识,能够仰慕)

既是已经确认客商所提交的数目是立见成效的,那么接下去就能够从数据库中询问那些有效的多寡(同样,在views.py里操作卡塔 尔(阿拉伯语:قطر‎:

from django.http import HttpResponse
from django.shortcuts import render_to_response
from mysite.books.models import Book

def search(request):
  if 'q' in request.GET and request.GET['q']:
    q = request.GET['q']
    books = Book.objects.filter(title__icontains=q)
    return render_to_response('search_results.html',
      {'books': books, 'query': q})
  else:
    return HttpResponse('Please submit a search term.')

让我们来分析一下方面包车型客车代码:

  •     除了检查q是不是留存于request.GET之外,大家还检查来reuqest.GET[‘q']的值是还是不是为空。
  •     大家选取Book.objects.filter(title__icontains=q)获取数据库中标题满含q的书本。 icontains是叁个询问关键字。这几个讲话能够领略为拿到标题里包括q的书籍,不区分朗朗上口写。
  •     那是完结书籍查询的一个很简短的措施。 大家不引入在一个包蕴大批量出品的数据库中应用icontains查询,因为那会相当慢。 (在顾名思义的案例中,我们得以行使以某种分类的自定义查询系统。 在英特网搜索“开源 全文字笔迹核实索”看看是或不是有好的艺术卡塔尔国

    最后,大家给模板传递来books,一个包蕴Book对象的列表。 查询结果的来得模板search_results.html如下所示:

<p>You searched for: <strong>{{ query }}</strong></p>

{% if books %}
  <p>Found {{ books|length }} book{{ books|pluralize }}.</p>
  <ul>
    {% for book in books %}
    <li>{{ book.title }}</li>
    {% endfor %}
  </ul>
{% else %}
  <p>No books matched your search criteria.</p>
{% endif %}

    注意这里pluralize的使用,那些过滤器在适当的时候会输出s(比方找到多本图书卡塔尔。

创立三个有关书籍、小编、出版社的事例: from django.db import modelsclass Publisher(models.Model): na...

望风是后生可畏款适用于公司内网的疏漏急速救急、巡航扫描系统,通过查找效果可清晰的垂询此中互联网资金财产分布情形,而且可钦定漏洞插件对搜索结果举行急速漏洞检查评定并出口结果报表。

 

环境:

望风是依据python的flask框架写的,数据库为mongodb。

可安装在Windows  OSX  Linux  Docker

Python2.7  pip  mongodb

安装:

自家设置在window,用于简单阅读代码和调养。

https://github.com/ysrc/xunfeng  

下载后接着官方网站的window安装教程就可以。

接下来运转 Run.bat (得利用管理员运维,不然没反应。。卡塔 尔(英语:State of Qatar)

 图片 1

 

安装成功。

阅读:

使用的ide为pycharm
Run.bat

 图片 2

 

mogod.exe 用于运行mongodb

Run.py 启动web网站

Aider.py  # 帮助验证脚本

VulScan.py  # 漏洞检查实验引擎

NAScan.py  # 网络资金财产消息抓取引擎

 

 

Run.py

from views.View import app

if __name__ == '__main__':
    #app.debug = True
    app.run(threaded=True, port=8888,host='')

 

去到views/View.py

 

一共有24个方法。

三个艺术三个艺术来看。

 

1.Search()

# 搜索页
@app.route('/filter')
@logincheck
def Search():
    return render_template('search.html')

  

@logincheck 使用了装饰器函数。跟过去查看views/lib/Login.py

# 登录状态检查
def logincheck(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        try:
            if session.has_key('login'):
                if session['login'] == 'loginsuccess':
                    return f(*args, **kwargs)
                else:
                    return redirect(url_for('Login'))
            else:
                return redirect(url_for('Login'))
        except Exception, e:
            print e
            return redirect(url_for('Error'))

    return wrapper

  

若是seesion中的login等于loginsuccess 就继续实行view.py下的函数。不然跳转掉Error模板。正是检验是或不是有记名。

 

回到Search() 加载search.html模板

 

 

2.Deleteall()

 

# 删除所有
@app.route('/deleteall', methods=['post'])
@logincheck
@anticsrf
def Deleteall():
    Mongo.coll['Task'].remove({})
    return 'success'

  

 

先判别了登陆境况,多了八个@anticsrf 装饰器函数。跟过去翻开views/lib/AntiCSWranglerF.py

# 检查referer
def anticsrf(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        try:
            if request.referrer and request.referrer.replace('http://', '').split('/')[0] == request.host:
                return f(*args, **kwargs)
            else:
                return redirect(url_for('NotFound'))
        except Exception, e:
            print e
            return redirect(url_for('Error'))

    return wrapper

  

 

看清是还是不是有referrer头,何况将 再分叉取第大器晚成局地,也正是抽取网站的host,然后与本站host相比较。看是还是不是意气风发律。不均等的话,跳转404页面。不然就继续执行。

@anticsrf 正是严防CSPRADOF漏洞的。

 

回到Deleteall()

Mongo 跟过去察觉是连接mongoDB。接纳Task那么些数据表,移除全体数据。

纵使将任务总量全体剔除。

 图片 3

 

 

3.Main()

# 搜索结果页
@app.route('/')
@logincheck
def Main():
    q = request.args.get('q', '')
    page = int(request.args.get('page', '1'))
    plugin = Mongo.coll['Plugin'].find()  # 插件列表
    plugin_type = plugin.distinct('type')  # 插件类型列表
    if q:  # 基于搜索条件显示结果
        result = q.strip().split(';')
        query = querylogic(result)
        cursor = Mongo.coll['Info'].find(query).sort('time', -1).limit(page_size).skip((page - 1) * page_size)
        return render_template('main.html', item=cursor, plugin=plugin, itemcount=cursor.count(),
                               plugin_type=plugin_type, query=q)
    else:  # 自定义,无任何结果,用户手工添加
        return render_template('main.html', item=[], plugin=plugin, itemcount=0, plugin_type=plugin_type)

  

判别是或不是登入(下同卡塔 尔(英语:State of Qatar)

先获得传入的q 和page 。

plugin = Mongo.coll['Plugin'].find()  #连接数据库,列出Plugin中所有清单。

plugin_type = plugin.distinct('type') #从查询的所有清单里面获取名字是 type的数据。

  

然后将q举办剪切“;”首就算分开相仿这种的 q= 127.0.0.1;127.8.8.1  

分成列表传入querylogic()函数。 跟过去探访views/lib/QueryLogic.py(详细:)

将追寻的值q转成mongoDB能查询的话语。

cursor = Mongo.coll['Info'].find(query).sort('time', -1).limit(page_size).skip((page - 1) * page_size)

在info表里把尺度代入查询sort()排序 limit()分页

末尾传给视图

 

 

4.Getplugin()

# 获取插件信息异步
@app.route('/getplugin', methods=['get', 'post'])
@logincheck
def Getplugin():
    type = request.form.get('type', '')
    risk = request.form.get('risk', '')
    search = request.form.get('search', '')
    query = {}
    if type:
        query['type'] = type
    if risk:
        query['level'] = risk
    if search:
        search = unquote(search)
        query['name'] = {"$regex": search, '$options': 'i'}
    cursor = Mongo.coll['Plugin'].find(query)
    rsp = []
    for i in cursor:
        result = {'name': i['name'], 'info': i['info']}
        rsp.append(result)
    return json.dumps(rsp)

  

 

拿到了type risk search 是还是不是有值

不曾的话,就满门查询。有的话 在Plugin表代入条件查询。然后将插件名字和新闻转json格式再次回到。

 

5.Addtask()

# 新增任务异步
@app.route('/addtask', methods=['get', 'post'])
@logincheck
@anticsrf
def Addtask():
    title = request.form.get('title', '')
    plugin = request.form.get('plugin', '')
    condition = unquote(request.form.get('condition', ''))
    plan = request.form.get('plan', 0)
    ids = request.form.get('ids', '')
    isupdate = request.form.get('isupdate', '0')
    resultcheck = request.form.get('resultcheck', '0')
    result = 'fail'
    if plugin:
        targets = []
        if resultcheck == 'true':  # 结果集全选
            list = condition.strip().split(';')
            query = querylogic(list)
            cursor = Mongo.coll['Info'].find(query)
            for i in cursor:
                tar = [i['ip'], i['port']]
                targets.append(tar)
        else:  # 当前页结果选择
            for i in ids.split(','):
                tar = [i.split(':')[0], int(i.split(':')[1])]
                targets.append(tar)
        temp_result = True
        for p in plugin.split(','):
            query = querylogic(condition.strip().split(';'))
            item = {'status': 0, 'title': title, 'plugin': p, 'condition': condition, 'time': datetime.now(),
                    'target': targets, 'plan': int(plan), 'isupdate': int(isupdate), 'query': dumps(query)}
            insert_reuslt = Mongo.coll['Task'].insert(item)
            if not insert_reuslt:
                temp_result = False
        if temp_result:
            result = 'success'
    return result

  

 

先获得了页面传了的值 先暗许result为fail

还未有plugin的话一贯回到fail

有的话,先推断结果集是还是不是全选,将结果集的ip和port都参与列表,不然将当前页的ip将入列表。 然后举行插入。成功重返success

 

6.Task()

# 任务列表页面
@app.route('/task')
@logincheck
def Task():
    page = int(request.args.get('page', '1'))
    cursor = Mongo.coll['Task'].find().sort('time', -1).limit(page_size).skip((page - 1) * page_size)
    return render_template('task.html', item=cursor)

询问出任务音讯,显示。

 图片 4

 

7.Recheck()

# 复测任务异步
@app.route('/taskrecheck')
@logincheck
@anticsrf
def Recheck():
    tid = request.args.get('taskid', '')
    task = Mongo.coll['Task'].find_one({'_id': ObjectId(tid)})
    result = 'fail'
    if task and task['plan'] == 0 and task['status'] == 2:  # 一次性任务,并且已经扫描完成
        result = Mongo.coll['Task'].update({'_id': ObjectId(tid)}, {'$set': {'status': 0}})
        if result:
            result = 'success'
    return result

  

找到任务后,推断扫描实现后,更新数据库。重临success。

本文由金沙澳门官网发布于网络编程,转载请注明出处:Python的Django框架中的表单处理示例,巡风源码阅

关键词: 金沙澳门官网